我在几个开源项目中遇到过非优化代码,因为程序员不考虑他们使用的是什么。
由于Math.Pow在内部使用Exp和Ln函数,因此两种情况之间的性能差异高达10倍,这是如何解释in this answer的。
在大多数情况下,通常的乘法比加电要好(功率小),但最好的当然是Exponentation by squaring algorithm。
因此,我认为编译器或JITter必须使用powers和其他函数来执行这种优化。为什么还没有推出呢?我说的对吗?
发布于 2012-09-22 18:14:34
再读一遍你引用的答案,它清楚地说明CRT使用的是微软从英特尔购买的pow()函数。您看到的使用Math.Log和Math.Exp的示例是本文作者在一本编程书籍中找到的示例。
通用求幂方法的“问题”在于,它们被构建为在所有情况下都能产生最准确的结果。在某些情况下,这通常会导致性能不佳。为了提高这些特定情况下的性能,必须添加条件逻辑,这会导致所有情况下的性能损失。因为在没有Math.Pow方法的情况下,平方或立方化值非常容易编写,所以没有必要优化这些情况,并为所有其他情况承担额外的损失。
发布于 2012-09-22 19:37:34
我会说这不是一个好主意,因为这两种方法每次都不会返回相同的结果。
下面是一个小的测试脚本
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;
});这两种实现的准确性各不相同。如果进行了可靠的计算,它应该是可重现的。例如,如果只是在发布实现中使用平方优化,那么调试和发布版本将返回不同的解决方案。这对于错误调试来说可能是相当混乱的。
https://stackoverflow.com/questions/12542802
复制相似问题