私はC ++とC#の開発者です。.NETフレームワークの最初のベータ版からC#アプリケーションを開発しており、C ++アプリケーションの開発で20年以上の経験があります。まず、C#コードはC ++アプリケーションよりも高速になることはありませんが、マネージコード、その機能、相互運用層、メモリ管理の内部、動的型システム、およびガベージコレクタについては、詳しく説明しません。それでも、ここに記載されているベンチマークはすべて正しくない結果を生むと言い続けます。
説明させてください:最初に考慮する必要があるのは、C#用のJITコンパイラ(.NET Framework 4)です。現在、JITは、さまざまな最適化アルゴリズム(Visual Studioに付属するデフォルトのC ++オプティマイザーよりも積極的である傾向があります)を使用してCPUのネイティブコードを生成し、.NET JITコンパイラーによって使用される命令セットは、実際のCPUをより反映していますマシン上で、マシンコードの特定の置換を行って、クロックサイクルを削減し、CPUパイプラインキャッシュのヒット率を向上させ、命令の並べ替えや分岐予測に関連する改善などのハイパースレッディング最適化をさらに生成できます。
つまり、RELEASEビルド(DEBUGビルドではない)の正しいパラメータを使用してC ++アプリケーションをコンパイルしない限り、C ++アプリケーションのパフォーマンスは、対応するC#または.NETベースのアプリケーションよりも遅くなる可能性があります。C ++アプリケーションでプロジェクトのプロパティを指定するときは、「完全な最適化」と「高速なコードを優先する」を必ず有効にしてください。64ビットマシンを使用している場合は、ターゲットプラットフォームとしてx64を生成するように指定する必要があります。指定しない場合、コードはパフォーマンスを大幅に低下させる変換サブレイヤー(WOW64)を介して実行されます。
コンパイラーで正しい最適化を実行すると、C ++アプリケーションの場合は.72秒、C#アプリケーションの場合は(両方ともリリースビルドで)1.16秒になります。C#アプリケーションは非常に基本的であり、ヒープではなくスタックのループで使用されるメモリを割り当てるため、実際には、オブジェクトに関係する実際のアプリケーション、大量の計算、およびより大きなデータセットよりもはるかに優れています。したがって、提供されている数値は、C#および.NETフレームワークに偏った楽観的な数値です。このバイアスがあっても、C ++アプリケーションは同等のC#アプリケーションよりも半分の時間で完了します。私が使用したMicrosoft C ++コンパイラには、適切なパイプラインとハイパースレッディング最適化(WinDBGを使用してアセンブリ命令を表示する)がなかったことに注意してください。
Intelコンパイラを使用すると(AMD / Intelプロセッサで高性能アプリケーションを生成するための業界の秘密です)、同じコードがC ++実行可能ファイルでは.54秒で実行されますが、Microsoft Visual Studio 2010では.72秒で実行されます。したがって、最終的に、最終結果はC ++の場合は.54秒、C#の場合は1.16秒になります。したがって、.NET JITコンパイラによって生成されるコードは、C ++実行可能ファイルよりも214%倍長くかかります。.54秒で費やされた時間のほとんどは、ループからではなく、システムから時間を取得するために費やされました。
統計に欠けているのは、タイミングに含まれていない起動時間とクリーンアップ時間です。C#アプリケーションは、C ++アプリケーションよりも起動と終了に多くの時間を費やす傾向があります。この背後にある理由は複雑であり、.NETランタイムコード検証ルーチンと、メモリ割り当てとガベージを最適化するためにプログラムの最初(そして結果として最後)で多くの作業を実行するメモリ管理サブシステムに関係しています。コレクタ。
C ++および.NET ILのパフォーマンスを測定するときは、アセンブリコードを見て、すべての計算が行われていることを確認することが重要です。私が見つけたのは、C#に追加のコードを配置せずに、上記の例のほとんどのコードが実際にはバイナリから削除されたことです。これは、インテルC ++コンパイラーに付属しているオプティマイザーなど、より強力なオプティマイザーを使用した場合のC ++にも当てはまります。上記で提供した結果は100%正確であり、アセンブリレベルで検証されています。
インターネット上の多くのフォーラムの主な問題は、多くの初心者がテクノロジーを理解せずにMicrosoftのマーケティング宣伝に耳を傾け、C#がC ++よりも速いという誤った主張をすることです。JITコンパイラーがCPUのコードを最適化できるため、理論的にはC#はC ++よりも高速であると主張しています。この理論の問題は、パフォーマンスを遅くする.NETフレームワークに存在する多くの配管が存在することです。C ++アプリケーションには存在しない配管。さらに、経験豊富な開発者は、特定のプラットフォームに使用する適切なコンパイラーを知っており、アプリケーションのコンパイル時に適切なフラグを使用します。Linuxまたはオープンソースプラットフォームでは、ソースを配布し、適切な最適化を使用してコードをコンパイルするインストールスクリプトを作成できるため、これは問題ではありません。Windowsまたはクローズドソースプラットフォームでは、複数の実行可能ファイルを配布し、それぞれに特定の最適化を行う必要があります。展開されるWindowsバイナリは、msiインストーラーによって検出されたCPUに基づいています(カスタムアクションを使用)。