開発環境
- 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 コメント:
コメントを投稿