web-dev-qa-db-ja.com

AnyCPUで構築されたC#アプリケーションと64ビットマシンのx64プラットフォームのパフォーマンス

C#アプリケーションを64ビットマシンにデプロイする必要がありますが、32ビットマシンにもデプロイできる可能性はわずかにあります。 x86およびx64プラットフォームをターゲットとする2つの個別の実行可能ファイルをビルドする必要がありますか、それとも「AnyCPU」プラットフォーム(プロジェクトプロパティのビルドオプションで指定)をターゲットとしてビルドされた単一の実行可能ファイルを使用する必要があります。「AnyCPU」をターゲットとしてビルドされたC#アセンブリ間にパフォーマンスの違いはありますか?特に「x64」プラットフォームを対象に構築された同じアセンブリに対して、64ビットマシンにデプロイされていますか?

34
Saurabh R S

いいえ、64ビットWindowsで実行されているAnyCPUアプリケーションとその上で実行されているx64アプリケーションのパフォーマンスに違いはありません。フラグが変更されるのは、コンパイルされたアセンブリのヘッダーにあるいくつかのフラグだけであり、CLRはそれを使用して、x86とx64のどちらを使用するかを決定します。

64ビットWindowsで実行されているx86アプリケーションとx64(またはAnyCPU)の間に違いがあるかどうかを尋ねている場合、答えは「はい」です。 2つの違いは次のとおりです。

  • 64ビットは明らかに32ビットの2倍の大きさの参照を使用します。これはメモリ消費量が多いことを意味しますが、より多くのメモリを使用できることも意味します。
  • 64ビットは、64ビットモードのCPUでのみ使用可能なより多くのレジスタを使用できます
  • 64ビットJITは32ビットJITとは異なり、最適化のセットが異なります。たとえば、64ビットJITは、tail.を使用して特に要求しなくても、 末尾呼び出しの最適化 を使用することがあります。命令(たとえば、C#は決して実行しません)
30
svick

上記の回答の補足として。 can AnyCPUを使用してx64OS上のx86DLLにP/InvokeまたはDotNetInteropを使用すると問題が発生します。 DLLの64ビットバージョンが利用できない場合、OSは64ビットバージョンをロードしようとするため、AnyCPUではなくx86をコンパイルする必要があるかもしれません...そして不合格。

7
Tephyrnex