宿題の片付け

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を疑ってみましたが関係なし。なんでだろう・・・

*1:Athlon64の所為ってことはないですよね?