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; }