[英]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.