おまけ

以下は上の欺瞞に満ちた実験に対する言い訳ですw.数値計算の泥臭い話で,ETの本筋の話から外れるのであんまし読まないでくださいw.
まず最初に,Explicitの書き方は毎回の演算ごとにindexingするあんまりよろしくない書き方で本来は以下の書き方が適切と思われます.

double *pt, *pu, *pv, *pw, *e;
pt = &t[0]; pu = &u[0]; pv = &v[0]; pw = &w[0]; e = pt + n;
while(pt != e){
  *pt++ = *pu++ + *pv++ + *pw++;
}

が,これに対応するETを実装しようとすると式オブジェクトにiteratorを定義しないといけなかったりして時間無いし,面倒くさいし,分かりにくいしでやりませんでした.
次にもう一つ,VC++7.1で実験した結果を載せておきます.

  • CPU: Athlon XP3200+ 2次キャッシュ 512KB
  • Memory: 512MB PC3200
  • OS: Windows XP Professional Edition
  • Compiler: VC++ 7.1
  • Compiler switch: /Ox /G7 /EHs /I(boostのインクルードパス)

結果です.

次元数*繰り返し回数SimpleAssignmentExplicitET
10*1000000011.680.870.140.96
100*10000003.200.600.140.85
1000*1000002.710.570.140.85
10000*100003.890.960.480.87
100000*100014.285.153.013.11
1000000*10014.315.142.963.01
10000000*10(メモリに乗り切らないのでやめました)
どうもExplicitのコードにunrollingをかけやがったみたいです.正直,VC++舐めてました・・・.この結果さえ見なければ,「ETはやっぱりすごい!えへへ」で済んでいたのに・・・orz.数値計算ってこういうさじ加減一つで大きく性能が変わるのが嫌いなんですよね・・・.