速度評価実験

これら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 的なコードを書くよりも,読みやすくかつ最適化が行われやすいようにシンプルなコードを書く方がよい,ということですよ.