パフォーマンス重視のアプリケーションを.Netに移行すると、C#のバージョンがプロセッサに応じてWin32/Cより30%から100%遅くなることがわかります(モバイルT7200プロセッサではそれ以上の違いがあります)。私はこれを示す非常に簡単なコードサンプルを持っています。簡潔にするために私はCのバージョンを示さなければならない - C#が直接翻訳したものです:C#(かなり遅い)とWin32/Cのパフォーマンスの違いはなぜですか?
#include "stdafx.h"
#include "Windows.h"
int array1[100000];
int array2[100000];
int Test();
int main(int argc, char* argv[])
{
int res = Test();
return 0;
}
int Test()
{
int calc,i,k;
calc = 0;
for (i = 0; i < 50000; i++) array1[i] = i + 2;
for (i = 0; i < 50000; i++) array2[i] = 2 * i - 2;
for (i = 0; i < 50000; i++)
{
for (k = 0; k < 50000; k++)
{
if (array1[i] == array2[k]) calc = calc - array2[i] + array1[k];
else calc = calc + array1[i] - array2[k];
}
}
return calc;
}
我々は我々が持っている「他」のためのWin32に解体を見れば:
35: else calc = calc + array1[i] - array2[k];
004011A0 jmp Test+0FCh (004011bc)
004011A2 mov eax,dword ptr [ebp-8]
004011A5 mov ecx,dword ptr [ebp-4]
004011A8 add ecx,dword ptr [eax*4+48DA70h]
004011AF mov edx,dword ptr [ebp-0Ch]
004011B2 sub ecx,dword ptr [edx*4+42BFF0h]
004011B9 mov dword ptr [ebp-4],ecx
(これはデバッグではなく私と一緒にクマ)
最適化されたexeファイルのCLRデバッガを使用して最適化されたC#バージョンのための解体:
else calc = calc + pev_tmp[i] - gat_tmp[k];
000000a7 mov eax,dword ptr [ebp-4]
000000aa mov edx,dword ptr [ebp-8]
000000ad mov ecx,dword ptr [ebp-10h]
000000b0 mov ecx,dword ptr [ecx]
000000b2 cmp edx,dword ptr [ecx+4]
000000b5 jb 000000BC
000000b7 call 792BC16C
000000bc add eax,dword ptr [ecx+edx*4+8]
000000c0 mov edx,dword ptr [ebp-0Ch]
000000c3 mov ecx,dword ptr [ebp-14h]
000000c6 mov ecx,dword ptr [ecx]
000000c8 cmp edx,dword ptr [ecx+4]
000000cb jb 000000D2
000000cd call 792BC16C
000000d2 sub eax,dword ptr [ecx+edx*4+8]
000000d6 mov dword ptr [ebp-4],eax
多くの命令、おそらくパフォーマンスの違いの原因。
だから、3つの質問は本当に:
は、私は2つのプログラムのための正しい解体で探していますかのツールは私を誤解していますか?
生成される命令の数の違いが違いの原因でない場合は、何ですか?
私たちのパフォーマンス重視のコードをすべてネイティブDLLに保存する以外に、できることは何でしょうか。事前 で
おかげでスティーブ
私は「建物の性能の重要なネイティブアプリケーションのようなものうーん...
アセンブリの指示の間にすべての改行を削除できますか? –
いつもと同じように、それをプロファイルして、最もパフォーマンスが高いヒットコストを正確に把握してください。 (あなたのコードに時間がかかるのは分かりませんので、私たちに質問する必要はありません。プロファイラーに尋ねてください)それ以外の単純なトリックは、NGenを通してC#コードを実行することです。パフォーマンスがかなり向上するはずです。 – jalf
比較するCLRのバージョン。私の知る限り、.NET 3.5 SP1 JITコンパイラは古いものよりも効率的です。また、x64 JITオプティマイザはx86よりも積極的です。 –