为什么平方根这么慢?

时间:2014-03-11 17:54:34

标签: c# vb.net math operator-keyword square-root

许多程序员都警告我不要使用平方根功能,而是将数字提升到半功率。我的问题有两个:

  1. 这样做的感知/真实性能优势是什么?为什么它更快?

  2. 如果真的更快,为什么平方根函数甚至存在?

2 个答案:

答案 0 :(得分:14)

我已经执行了简单测试

  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替换

答案 1 :(得分:9)

你必须知道如何实现每个功能才能回答这个问题。

平方根函数使用Newton's method迭代计算平方根。它以二次方式收敛。什么都不会加速。

其他函数exp()和ln(x)的实现具有自己的收敛/复杂性问题。例如,可以将它们都实现为series sums。需要一定数量的术语才能保持足够的准确性。

如果这些功能碰巧在本机代码中实现,则所有投注均已关闭。那些可能比你写的任何东西都快。

了解这些将让您做出明智的决定。我不会信仰它,因为那些程序员&#34;知道&#34;答案。

除非您正在进行密集的数字工作,否则我说这个选择不会影响您的整体计划效果。除非您正在进行严肃的大规模科学编程,否则最好避免使用微观优化。