我在几个开源项目中遇到过非最佳代码,当时程序员不考虑他们在使用什么。
由于 Math.Pow 在内部使用 Exp 和 Ln 函数,两种情况之间的性能差异高达 10 倍,如何在此答案中进行解释。
在大多数情况下,通常的乘法比幂(小幂)要好,但最好的当然是平方算法的指数。
因此,我认为编译器或 JITter 必须使用权力和其他功能执行此类优化。为什么还没有介绍?我对吗?
再次阅读您引用的anwser,它明确指出CRT使用pow()
微软从英特尔购买的功能。您看到Math.Log
的Math.Exp
示例是本文作者在编程书中找到的示例。
一般取幂方法的“问题”是它们的构建是为了在所有情况下产生最准确的结果。对于某些情况,这通常会导致次优性能。为了提高这些特定情况的性能,必须添加条件逻辑,这会导致所有情况的性能损失。因为在没有该方法的情况下对一个值进行平方或立方运算很容易编写Math.Pow
,因此无需优化这些情况并为所有其他情况承担额外的损失。
我会说这不是一个好主意,因为这两种方法每次都不会返回相同的结果。
这是一个小测试脚本
var r = new Random();
var any = Enumerable.Range(0, 1000).AsParallel().All(p =>
{
var d = r.NextDouble();
var pow = Math.Pow(d, 2.0);
var sqr = d * d;
var identical = pow == sqr;
if (!identical)
MessageBox.Show(d.ToString());
return identical;
});
两种实现的精度不同。如果进行了可靠的计算,它应该是可重现的。例如,如果仅在发布实现中使用方形优化,则调试和发布版本将返回不同的解决方案。这对于错误调试来说可能是一团糟......