我在几个开源项目中遇到过非最佳代码,当时程序员没有考虑他们使用的是什么。
两种情况之间的性能差异高达 10 倍,因为 Math.Pow 在内部使用 Exp 和 Ln 函数,如何解释 in this answer .
在大多数情况下(小幂),通常的乘法比乘法好,但最好的当然是 Exponentation by squaring algorithm .
因此,我认为编译器或JITter必须以权力和其他功能来执行这种优化。为什么还没有介绍?我说得对吗?
最佳答案
再次阅读您引用的答案,它清楚地表明 CRT 使用微软从英特尔购买的 pow()
函数。您看到的使用 Math.Log
和 Math.Exp
的示例是本文作者在编程书籍中找到的示例。
一般求幂方法的“问题”在于,它们的构建目的是为所有 情况生成最准确的结果。对于某些情况,这通常会导致次优性能。为了提高这些特定情况的性能,必须添加条件逻辑,这会导致所有情况的性能损失。因为在没有 Math.Pow
方法的情况下对一个值进行平方或立方是很简单的,所以不需要优化这些情况并为所有其他情况承担额外的损失。
关于c# - 为什么 Math.Pow(x, 2) 没有针对 x * x 进行优化,既不是编译器也不是 JIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542802/