簡體   English   中英

為什么vector.Length比Math.sqrt()快?

[英]Why is the vector.Length faster than Math.sqrt ()?

我有一個關於比較Vector.Length和Math.sqrt的速度的問題。 我使用以下代碼來比較速度。

int cnt = 100000;
double result = 0;
Vector A = new Vector(1.342,2.0);
Vector B = new Vector(5.1234,2.0);
Stopwatch sw = new Stopwatch();

sw.Start();
while(cnt-- > 1)
{
  Vector AB = A-B;
  result = AB.Length;
}
sw.Stop();
System.Console.WriteLine("Vector : " + sw.Elapsed);
sw.Reset();

cnt = 100000;
sw.Start();
while(cnt-- >1)
{
result = Math.Sqrt((B.X-A.X)*(B.X-A.X)+(B.Y-A.Y)*(B.Y-A.Y));
}
sw.Stop();
System.Console.WriteLine("Sqrt : " + sw.Elapsed);

結果:

Vector : 00:00:00.0019342
Sqrt : 00:00:00.0041913

結果顯示Vector.LengthMath.Sqrt()快。 我認為Vector.Length通過使用Math.Sqrt()來計算長度。 然后Vector.Length等於或慢於Math.Sqrt() 為什么它與我的想法有所不同? 如何計算Vector.Length?

您的測試太快了,這就是Vector.Length的定義方式:

public double Length
{
    get
    {
        return Math.Sqrt((this._x * this._x) + (this._y * this._y));
    }
}

和減號運算符:

public static Vector operator -(Vector vector1, Vector vector2)
{
    return new Vector(vector1._x - vector2._x, vector1._y - vector2._y);
}
 Vector : 00:00:00.0019342

不,這在大多數機器上都太慢了。 告訴我們你做錯了什么,你運行了程序的Debug版本。 確保准確計時的基本對策:

  • Build> Configuration Manager> Active solution configuration combobox>選擇Release
  • 在代碼周圍放一個for循環來運行測試10次,擺脫啟動開銷效應
  • 工具>選項>調試>常規>取消選中“抑制JIT優化”復選框

懶惰筆記本電腦上的輸出:

Vector : 00:00:00.0000975
Sqrt : 00:00:00.0000917
Vector : 00:00:00.0000912
Sqrt : 00:00:00.0000917
Vector : 00:00:00.0000917
Sqrt : 00:00:00.0000917
Vector : 00:00:00.0000912
... etc

完全一樣快,就像它應該的那樣。 此測量用於x86抖動,VS2015中發布的新x64抖動使Vector.Length效率降低。

如您所知,內置於抖動中的優化器對於獲得高效代碼非常重要。 它為您的原始測試提供了Vector.Length優勢,在您的計算機上安裝了.NET Framework后,它得到了優化。 這項工作由NGen.exe完成。 更多關於優化器在此答案中的作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM