EDIT: [ツール]> [オプション]> [デバッグ]> [モジュールロード時にJIT最適化を抑制]>チェックを外す(デバッグモードでもJIT最適化を行うにはこのオプションをオフにします) 。擬似コードが利用可能な場合、生成されたマシンコードは良くないことがわかります! 高速版では、コードはCPUを直接使用してを登録しますが、それ以外のバージョンでは、すべての繰り返しでメモリからp1.xとp1.yをロードします!私はそのような行動をどうやってコントロールできるのか分かりません!どのように単純なコード行が次のコードの実行時間に大きく影響するか?
パフォーマンステスト用のコードブロックの実行時間を測定しようとしていたとき、私は混乱していました。実際の測定ループの前に(疑似)コードブロックを追加すると、合計経過時間は大きな要因(から120ミリ秒から220ミリ秒、すなわち、2GHzのPCでは約1.8倍遅い!)増加しました。 実際には、これらの擬似コードは、初期化または同様の目的に必要ないくつかの異なるコードです。
注:私はリリースモードでアプリを構築し、すべての最適化が最良の結果を得るために適用されることを保証するために、デバッグなしスタート(Ctrlキー+ F5)てそれを実行します。
私はサンプルとしてここに簡略化されたシナリオを示しています。
void test()
{
Point p1 = new Point(1, 2);
Point p = p1;
//*** !!! Comment & UnComment the following 2 lines to see difference: ***
p.Offset(p1); p.Offset(p1); p.Offset(p1); p.Offset(p1);
p.Offset(p1); p.Offset(p1); p.Offset(p1); p.Offset(p1);
Stopwatch timer = new Stopwatch();
double dt = -1;
for (int repeat = 1; repeat <= 5; repeat++)
{
p = p1; //here we reset the initial p
timer.Restart();
for (int i = 0; i < 50000000; i++)
{
p.Offset(p1);
}
timer.Stop();
dt = timer.ElapsedMilliseconds;
textBox1.Text += repeat + "] " + dt + ", p: " + p + "\r\n";
Application.DoEvents(); if (this.IsDisposed) break;
}
}
private void button1_Click(object sender, EventArgs e)
{
test();
}
この問題は、私は最適化のために必要な結果の比較から私を防ぎます。 ところで、これはstruct
タイプ(?)に関連している可能性があります。
理由と解決方法は何ですか。
EDIT(4月4日):この現象はstruct
のタイプではなく、class
タイプでのみ発生することを確認しました。私たちが知っているように、構造体は通常、ヒープではなくスタックの値型です。
別のノート:私は、プロジェクトのプロパティ>ビルドタブで[コードの最適化]オプションのチェックを外すと、コードが実際に速く実行されることも発見しました。
DIS-アセンブリ:
VSの外でリリースビルドを使用していることを確認してください。 – MarcinJuraszek
私は問題を再現できません。私の結果は、2つの行がコメントされているかどうかに関係なく、同じ実行セッション内で100から600まで変化します。リリースビルド、デバッガなし。 –
注:私は 'release mode'でアプリケーションをビルドし、' Start Without Debug'を押します。これらの設定がなければ、結果はVisual Studioによって最適化されず、毎回変化します! –