開発環境
- OS X Mavericks - Apple, ときどきWindows 8.1 + Cygwin64, MinGW (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C++ (プログラミング言語)
- g++(コンパイラ)
C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅣ部(高度なプログラミング概念)の17章(デバッグと最適化)、17.12(プログラミング実習)、実習 17-2.を解いてみる。
その他参考書籍
- C++プログラミング入門 (グレゴリー サティア (著)、ダウグ ブラウン (著)、Gregory Satir (原著)、Doug Brown (原著)、望月 康司 (翻訳)、谷口 功 (翻訳)、オライリージャパン)
実習 17-2.
コード(BBEdit, Emacs)
sample344_2_1.cpp
#include <cstring> const int X_SIZE = 1000; const int Y_SIZE = 1000; int matrix1[X_SIZE][Y_SIZE]; int matrix2[Y_SIZE][X_SIZE]; int matrix3[X_SIZE][X_SIZE]; int main(int argc, char *argv[]) { int i; int j; int k; std::memset(matrix1, -1, sizeof(matrix1)); std::memset(matrix2, -1, sizeof(matrix2)); for (i = 0; i < X_SIZE; ++i) for (j = 0; j < X_SIZE; ++j) { matrix3[i][j] = 0; for (k = 0; k < Y_SIZE; ++k) matrix3[i][j] += matrix1[i][k] * matrix2[k][j]; } return (0); }
前のコードからiとjも除去してみたコード。
sample344_2_2.cpp
#include <cstring> const int X_SIZE = 1000; const int Y_SIZE = 1000; const int XY = X_SIZE * Y_SIZE; int matrix1[X_SIZE][Y_SIZE]; int matrix2[Y_SIZE][X_SIZE]; int matrix3[X_SIZE][X_SIZE]; int main(int argc, char *argv[]) { int *matrix1_ptr; int *matrix2_ptr; int *matrix3_ptr; int *t1_ptr; int *t2_ptr; int *t3_ptr; std::memset(matrix1, -1, sizeof(matrix1)); std::memset(matrix2, -1, sizeof(matrix2)); matrix1_ptr = &matrix1[0][0]; matrix2_ptr = &matrix2[0][0]; matrix3_ptr = &matrix3[0][0]; t1_ptr = matrix1_ptr; t2_ptr = matrix2_ptr; t3_ptr = matrix3_ptr; for (; matrix3_ptr <= &matrix3[X_SIZE - 1][X_SIZE - 1]; ++matrix3_ptr) { *matrix3_ptr = 0; for (; matrix2_ptr <= &matrix2[Y_SIZE -1][X_SIZE - 1]; ++matrix1_ptr, matrix2_ptr += X_SIZE) *matrix3_ptr += *matrix1_ptr * *matrix2_ptr; if (matrix3_ptr - t3_ptr == X_SIZE - 1) { t3_ptr += X_SIZE; matrix2_ptr = t2_ptr; } else { matrix1_ptr -= Y_SIZE; matrix2_ptr -= XY; ++matrix2_ptr; } } return (0); }
Makefile
# # FSFのg++コンパイラ用のMakefile # CC=g++ CFLAGS=-g -Wall all: sample344_2_1 sample344_2_2 sample344_2_1: sample344_2_1.cpp ${CC} ${CFLAGS} -o sample344_2_1 sample344_2_1.cpp sample344_2_2: sample344_2_2.cpp ${CC} ${CFLAGS} -o sample344_2_2 sample344_2_2.cpp clean: rm sample344_2_1 sample344_2_2
入出力結果(Terminal)
$ make g++ -g -Wall -o sample344_2_1 sample344_2_1.cpp g++ -g -Wall -o sample344_2_2 sample344_2_2.cpp $ time ./sample344_2_1 real 0m49.664s user 0m29.094s sys 0m0.271s $ time ./sample344_2_2 real 0m45.594s user 0m26.875s sys 0m0.235s $
0 コメント:
コメントを投稿