我被许多程序员警告不要使用平方根功能,而是将数字提升到半功率。我的问题是双重的:
我做了一个简单的测试:
Stopwatch sw = new Stopwatch();
sw.Start();
Double s = 0.0;
// compute 1e8 times either Sqrt(x) or its emulation as Pow(x, 0.5)
for (Double d = 0; d < 1e8; d += 1)
// s += Math.Sqrt(d); // <- uncomment it to test Sqrt
s += Math.Pow(d, 0.5); // <- uncomment it to test Pow
sw.Stop();
Console.Out.Write(sw.ElapsedMilliseconds);
我的工作站(x64)的(平均)结果是
Sqrt: 950 ms
Pow: 5500 ms
正如你所看到的,更具体的Sqrt(x)
比它的模拟Pow(x, 0.5)
快5.5倍。所以它只是另一个传奇(至少在C#中),Sqrt
是慢的,应该更喜欢Pow
替代
您必须了解每个函数如何实现以回答问题。
平方根函数使用Newton's method迭代计算平方根。它以二次方式收敛。什么都不会加快速度。
其他函数exp()和ln(x)具有自己的收敛/复杂性问题的实现。例如,可以将两者都实现为series sums。需要一定数量的术语才能保持足够的准确性。
如果这些功能碰巧在本机代码中实现,那么所有的赌注都会被取消。那些可能比你写的任何东西都要快。
了解这些将让您做出明智的决定。我不会信仰它,因为那些程序员“知道”答案。
除非你正在进行密集的数字工作,否则我会说这个选择不会影响你的整体计划表现。除非你正在进行严肃的大规模科学编程,否则最好避免微观优化。