宿題の片付け
http://d.hatena.ne.jp/akiramei/20040811#p1で放置したままだったVC++2005でのテストを今頃やりました。(^^;
#include "stdafx.h" const int loop = 1024 * 64; int _tmain(int argc, _TCHAR* argv[]) { DWORD t0 = GetTickCount(); char a[loop]; for(int i=0;i<loop;++i) { for(int j=loop-1;j>=0;--j) { a[i] = a[j]; } } DWORD t1 = GetTickCount(); printf("%ld\n", t1 - t0); return 0; } /* 結果 5922 */
実行マシンが変わっているのでC#の結果も再測定しました。
/* VC# 2005 Express on Pentium4 2.0GHz ArrayConst :00:00:06.8906250 FixedConst :00:00:09.3906250 StatckAllocConst :00:00:04.7968750 AllocHGlobalConst :00:00:04.8281250 ArrayLocal :00:00:10.4062500 ArrayLength :00:00:06.8437500 */ /* VS 2005 on Athlon64 3200+ (2.2GHz) ArrayConst :00:00:06.1093750 FixedConst :00:00:08.0156250 StatckAllocConst :00:00:05.9375000 AllocHGlobalConst :00:00:05.9218750 ArrayLocal :00:00:05.9375000 ArrayLength :00:00:05.9375000 */
この程度のプログラムだとC++もC#も差がつかないようです。また、同じC#のコンパイル結果でもVC# 2005ExpressとVS 2005ではかなり違います。CPUが違うので単純な比較はできませんが、たとえばArrayLocalとArrayLengthを取ってもVC#2005 Expressでは明らかに差があったのがなくなっています。C#のソース→IL→ネイティブコードの流れで、IL以降は同じランタイム上で動いているのでC#コンパイラでの最適化で差が出ているのでしょうが*1、結構でかいですね。
StackAllocConstとAllocHGlobalConstがAthlon64で遅くなっているのがちょっと気になります。DEPを疑ってみましたが関係なし。なんでだろう・・・