为什么平方根这么慢?

问题描述 投票:7回答:2

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

  1. 这样做的感知/真实表现有什么好处?为什么它更快?
  2. 如果它真的更快,为什么平方根函数甚至存在?
c# vb.net math operator-keyword square-root
2个回答
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替代


9
投票

您必须了解每个函数如何实现以回答问题。

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

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

如果这些功能碰巧在本机代码中实现,那么所有的赌注都会被取消。那些可能比你写的任何东西都要快。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.