これについては、c# チャットで継続的な議論が行われています。元の質問はこれでした:
たとえば (Int32) 5+5 は 1234723847+32489237 よりも速く計算されますか?
私の最初の考えは、パディング ゼロを無視するためにバイナリ レベルで最適化が行われるので、数値が小さいほど高速になるというものでした。
それで、私はそれをテストしました。興味のある方はこちらのプログラムをどうぞ。そうでない場合は、結果にスキップしてください。
Stopwatch sw = new Stopwatch();
Int64 c = 0;
long msDifferential = 0; //
int reps = 10; //number of times to run the entire program
for (int j = 0; j < reps; j++)
{
sw.Start(); //
sw.Stop(); // Just in case there's any kind of overhead for the first Start()
sw.Reset(); //
sw.Start(); //One hundred million additions of "small" numbers
for (Int64 i = 0, k = 1; i < 100000000; i++, k++)
{
c = i + k;
}
sw.Stop();
long tickssmall = sw.ElapsedTicks;
long mssmall = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start(); //One hundred million additions of "big" numbers
for (Int64 i = 100000000000000000, k = 100000000000000001; i < 100000000100000000; i++, k++)
{
c = i + k;
}
sw.Stop();
long ticksbig = sw.ElapsedTicks;
long msbig = sw.ElapsedMilliseconds;
//total differentials for additions
ticksDifferential += ticksbig - tickssmall;
msDifferential += msbig - mssmall;
}
//average differentials per 100000000 additions
long averageDifferentialTicks = ticksDifferential / reps;
long averageDifferentialMs = msDifferential / reps;
//average differentials per addition
long unitAverageDifferentialTicks = averageDifferentialTicks / 100000000;
long unitAverageDifferentialMs = averageDifferentialMs / 100000000;
System.IO.File.AppendAllText(@"C:\Users\phillip.schmidt\My Documents\AdditionTimer.txt", "Average Differential (Ticks): " + unitAverageDifferentialTicks.ToString() + ", ");
System.IO.File.AppendAllText(@"C:\Users\phillip.schmidt\My Documents\AdditionTimer.txt", "Average Differential (Milliseconds): " + unitAverageDifferentialMs.ToString());
結果
デバッグモード
- 平均単位差: 2.17 ナノ秒
リリース モード (最適化有効)
- 平均単位差分: 0.001 ナノ秒
リリース モード (最適化無効)
- 平均単位差分: 0.01 ナノ秒
したがって、デバッグ モードでは、「大きい」数値は、「小さい」数値よりも加算ごとに合計するのに約 2.17 ナノ秒長くかかります。ただし、リリース モードでは、違いはほとんどありません。
質問
そのため、いくつかのフォローアップの質問がありました。
- 私の目的にはどのモードが最も正確ですか? (デバッグ、リリース、リリース(オプトなし))
- 私の結果は正確ですか?もしそうなら、速度の違いの原因は何ですか?
- デバッグモードの違いがこれほど大きいのはなぜですか?
- 他に考慮すべきことはありますか?