WOW64の性能計測

WOW64はコストがかかる - odawaraの「はてな de メモ」
昨日の続き。
XPの64bit環境で実行しました。win32がWOW64での実行。
ビルドはリリースビルド。下サイズのメモリを指定回数分memcpy()したときの時間を計測。16Bの場合はL1かL2に乗るはず。

環境 512MB*16回(msec) 16B*512M回(msec)
win32 3749.99 724.47
x64 2963.65 695.96
比較 127% 104%

ただ、16Bよりも小さいサイズのコピーになるとややこしくて、性能が逆転する。

環境 512MB*16回(msec) 16B*512M回(msec) 10B*512M回(msec) 8B*512M回(msec)
win32 3749.99 724.47 543.94 363.46
x64 2963.65 695.96 697.28 540.77
比較 127% 104% 78% 67%

という結果になる。難しいなぁWOW64。
以下ソース。

// wow64_bench.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	LARGE_INTEGER nFreq, nBefore, nAfter;
	PUCHAR src,dst;
	int size = 16;
	int count= 512*1024*1024;

	src = (PUCHAR)malloc(size);
	dst = (PUCHAR)malloc(size);
	memset(src,0,size);
	memset(dst,0,size);

	memset(&nFreq,   0x00, sizeof nFreq);
	memset(&nBefore, 0x00, sizeof nBefore);
	memset(&nAfter,  0x00, sizeof nAfter);
	QueryPerformanceCounter(&nBefore);	
	for(int i=0;i<count;i++){
		memcpy(dst,src,size);
	}
	QueryPerformanceCounter(&nAfter);
	QueryPerformanceFrequency(&nFreq);

	double dwtime = (double)((double)((nAfter.QuadPart - nBefore.QuadPart) * 1000) / nFreq.QuadPart);

	printf("TOTAL %0.2lf msec\n",dwtime);

	free(src);
	free(dst);
	return 0;
}