c# - 为什么 Math.Pow(x, 2) 没有针对 x * x 进行优化,既不是编译器也不是 JIT?

标签 c# .net performance optimization jit

我在几个开源项目中遇到过非最佳代码,当时程序员没有考虑他们使用的是什么。

两种情况之间的性能差异高达 10 倍,因为 Math.Pow 在内部使用 Exp 和 Ln 函数,如何解释 in this answer .

在大多数情况下(小幂),通常的乘法比乘法好,但最好的当然是 Exponentation by squaring algorithm .

因此,我认为编译器或JITter必须以权力和其他功能来执行这种优化。为什么还没有介绍?我说得对吗?

最佳答案

再次阅读您引用的答案,它清楚地表明 CRT 使用微软从英特尔购买的 pow() 函数。您看到的使用 Math.LogMath.Exp 的示例是本文作者在编程书籍中找到的示例。

一般求幂方法的“问题”在于,它们的构建目的是为所有 情况生成最准确的结果。对于某些情况,这通常会导致次优性能。为了提高这些特定情况的性能,必须添加条件逻辑,这会导致所有情况的性能损失。因为在没有 Math.Pow 方法的情况下对一个值进行平方或立方是很简单的,所以不需要优化这些情况并为所有其他情况承担额外的损失。

关于c# - 为什么 Math.Pow(x, 2) 没有针对 x * x 进行优化,既不是编译器也不是 JIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542802/

相关文章:

c# - Debug vs Release in optimization of .net(分发给用户时的顾虑)

c# - 如何在卸载时保留用户设置

c++ - N体算法 : why is this slower in parallel?

php - 背景更换器刷新

ios - UIDocument & NSFileWrapper 架构和性能

c# - 几个嵌套的if条件

c# - 如何在 ASP.NET Core 中更改 Swagger 的基本 URL

c# - ASP.NET core 2.2 web api 记录与数据保护 key 相关的警告 : how should we handle this issue?

c# - 在对子类使用 'dynamic' (C#) 时,.NET 4 如何决定调用哪个方法?

c# - 通过反射在复制的列表中设置属性更新原始列表