仮想化下で実行すると、ソフトウェアの実行速度が非常に遅くなる理由を理解しようとしています。私が見たほとんどの統計では、最悪の場合でも 10% のパフォーマンス ペナルティしかないはずですが、Windows 仮想サーバーでは、パフォーマンス ペナルティは 100 ~ 400% になる可能性があります。違いをプロファイリングしようとしましたが、プロファイルの結果はあまり意味がありません。仮想化なしの Vista 32 ビット ボックスでプロファイリングすると、次のようになります。
仮想化された Windows 2008 64 ビット サーバーでの実行例を次に示します。
遅いものは非常に多くの時間をRtlInitializeExceptionChain
費やしており、速いものでは 0.0 秒と表示されます。それが何をするのか分かりますか?また、マシンのプロセスにアタッチするとスレッドは 1 つしかありませんPulseEvent
が、サーバーに接続すると 2 つのスレッドがありGetDurationFormatEx
、RtlInitializeExceptionChain
. 私が知る限り、私たちが書いたコードは 1 つのスレッドしか使用していません。また、これは純粋な C で書かれたコンソールのみのアプリケーションであり、UI はまったくありません。
誰かが私のためにこれについて何か光を当てることができますか? これらntdll
とkernel32
呼び出しのいくつかが何をしているのかについての情報だけでも? また、どの程度の違いが 64/32 ビットに関連しており、どれだけが仮想/非仮想に関連しているのかもわかりません。残念ながら、違いを判断するための他の構成に簡単にアクセスすることはできません。