C# 除算が乗算より遅いのはなぜですか?
プログラミング言語、特に C# では、加算、減算、乗算、除算の 4 つの算術演算を実行できます。
外部から見ると、パフォーマンスの点ではすべてが同じように見えるかもしれませんが、そのうちの 1 つは他の 3 つと比べてはるかに遅いことがわかります。
どちらが遅いですか? 部門。
この HP 論文 によると:
浮動小数点の除算と平方根は、加算や乗算よりも計算にかなり時間がかかります。後者の 2 つは直接計算されますが、前者は通常、反復アルゴリズムで計算されます。最も一般的なアプローチは、除算のないニュートン・ラフソン反復を使用して、分母の逆数 (除算) または平方根の逆数の近似を取得し、分子 (除算) または入力引数 (平方根) を乗算することです。 。
上記のステートメントを検証するために、以下のコードを使用して簡単なテストを実行することにしました。
//Generate two random numbers
var rand = new System.Random();
float a = rand.Next();
float b = rand.Next();
Debug.Log("Number a: " + a + " Number b: " + b);
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
//Addition
for (int i = 1; i < 1000000; i++)
{
float tmp = a + b;
}
watch.Stop();
//Output
Debug.Log("Addition took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
watch.Reset();
watch.Start();
//Subtraction
for (int i = 1; i < 1000000; i++)
{
float tmp = a - b;
}
watch.Stop();
//Output
Debug.Log("Subtraction took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
watch.Reset();
watch.Start();
//Multiplication
for (int i = 1; i < 1000000; i++)
{
float tmp = a * b;
}
watch.Stop();
//Output
Debug.Log("Multiplication took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
watch.Reset();
watch.Start();
//Division
for (int i = 1; i < 1000000; i++)
{
float tmp = a / b;
}
watch.Stop();
//Division
Debug.Log("Division took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
基本的に、2 つの乱数に対して 100 万回の加算、減算、乗算、除算を実行し、それぞれの処理にかかる時間を測定しました。テストは 5 回繰り返され、結果は次のとおりです。
- 加算には平均 0.0004 秒かかりました
- 減算には平均して 0.0003 秒かかりました
- 乗算には平均 0.0003 秒かかりました
- 除算には平均 0.0044 秒かかりました
その結果、加算、減算、乗算はパフォーマンスの点では同様ですが、除算は約 1100% 遅いことがわかりました。
小さな違いではないため、可能な場合は常に除算ではなく乗算を使用する方が良いという結論につながります。たとえば、数値を 2 で割る必要がある場合は、代わりに 0.5 を掛けるのが最適です。