2016-10-12 15 views
2

this QAによると、64ビットマシンで実行されているAny CPUとx64を使用して構築されたアプリケーションのパフォーマンスに違いはありませんが、私のユースケースでは、特にx64プラットフォーム用に構築されたときのパフォーマンスが向上します。AnyCPUと64ビットマシン上のx64プラットフォームのパフォーマンスの差

私の使用例は、64ビットbitboardsを操作するためのものであり、処理の大部分はビット演算とulong変数の算術演算です。一例として、

:リリースで

public static ulong ReverseBits(ulong x) 
{ 
    ulong t; 
    x = (x << 32) | (x >> 32); // Swap register halves. 
    x = (x & 0x0001FFFF0001FFFFUL) << 15 | // Rotate left 
     (x & 0xFFFE0000FFFE0000UL) >> 17; // 15. 
    t = (x^(x >> 10)) & 0x003F801F003F801FUL; 
    x = (t | (t << 10))^x; 
    t = (x^(x >> 4)) & 0x0E0384210E038421UL; 
    x = (t | (t << 4))^x; 
    t = (x^(x >> 2)) & 0x2248884222488842UL; 
    x = (t | (t << 2))^x; 
    return x; 
} 

static void Main(string[] args) 
{ 
    ulong sum = 0; 
    var s = Stopwatch.StartNew(); 
    for (ulong i = 0; i < 1000000000; i++) 
    { 
     sum += ReverseBits(i); 
    } 
    s.Stop(); 

    Console.WriteLine("Sum = {0}, took {1}ms", sum, s.ElapsedMilliseconds); 
    Console.ReadLine(); 
} 

結果がされているすべてのCPUプラットフォームでビルド:x64プラットフォームでのリリースで Sum = 9745675244420464640, took 13148ms

構築の結果は次のとおりです。以上ですSum = 9745675244420464640, took 5693ms

ダブルパフォーマンスが向上します。どのような大きな違いがあるのでしょうか?一般的な前提として、任意のCPU vs x64ビルドが64ビットマシンで同じものを実行する必要があります。

+0

はoptmizeコードの有無にかかわらずですか? – Franck

+2

'Environment.Is64BitProcess'を印刷して、実際には64ビットコードを実行していることを確認することをお勧めします。 –

+0

@JonSkeetあなたは頭の爪に当たっています。どのCPUも32ビットコードを実行しています。私は印象に残っていた64ビットマシン上で実行されると、常にどのCPUも64ビットを実行します。これを強制する方法はありますか、またはx64は行く方法ですか? – Beyers

答えて

6

いいえ、32ビットと64ビットのコードの間でperfを比較しました。 x64フレーバーは、単一の64ビットプロセッサー・レジスターで計算を実行できるので、はるかに高速です。これは32ビットマシンコードではるかに多くのことですが、2つの32ビットレジスタを混乱させる必要があります。デバッグ> Windows>逆アセンブリで、2つの違いを簡単に確認できます。

解決方法のプラットフォーム名に多大な注意を払ったため、これは間違っていました。あまりにも目立つように表示されますが、C++プロジェクトにとって重要な選択肢です。残念なことに、.NET NativeのためにUWPプロジェクトで。それはビルドツールのフレーバーを選択し、C#はどのプラットフォームもターゲットとするコンパイラを1つしか持たない。

実際の設定は、ジッタ強制オプションです。プロジェクト>プロパティ>ビルドタブをクリックします。必要に応じてリリースビルドを選択し、プラットフォームターゲットと「32ビット優先」設定を選択します。後者を取り消す。これで、64ビットオペレーティングシステムでAnyCPU == x64が表示されます。

関連する問題