速度評価実験
これら3つの条件 A,B,C で計算時間を測ってみた.コードはこんな感じ.
int main(int ac, char **av) { const int W=atoi(av[1]); const int H=atoi(av[2]); int *data= new int[W*H]; for (int i=0; i<100000; ++i) #ifdef A for (int y=0; y<H; ++y) for (int x=0; x<W; ++x) data[y*W+x]=i; #endif #ifdef B for (int x=0; x<W*H; ++x) data[x]=i; #endif #ifdef C for (int *addr=data; addr<&data[W*H]; ++addr) *addr=i; #endif delete[] data; }
実験環境は intel Pentium4 3.06GHz×2,GCC 4.0.2 20050808(ubuntu5.10),並列化処理は一切無し.コンパイルオプションは -O0 (最適化せず).
コマンドは以下として,100×100の2次元データに関して実験した.
./a.out 100 100
結果は以下.3回の実験の平均値.試行のバラツキはどれもせいぜい±0.05秒くらい
コード | 実時間(秒) |
---|---|
A | 10.7 |
B | 4.7 |
C | 3.2 |
やはり,コードによって速度が向上していることが分かる.
ちなみに,最適化(-O3)すると結果はこのようになる.
コード | 実時間(秒) |
---|---|
A | 0.82 |
B | 0.68 |
C | 0.66 |
速度は大体変わらなくなることが分かる.特に,B と C では結果はほとんど変わらない.
ま,この結果からいえることは,よほど必要に差し迫られていなければ,プログラマが最適なコードを書くよりも,最適化アルゴリズムに任せる方がよっぽど効果的,という感じでしょうか.ようは,上のコード C のような読みにくい Tips 的なコードを書くよりも,読みやすくかつ最適化が行われやすいようにシンプルなコードを書く方がよい,ということですよ.