[英]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.Length
比Math.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版本。 確保准確計時的基本對策:
懶惰筆記本電腦上的輸出:
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.