在 Exercism 网站上解决这个练习时,我使用了标准的 math.Pow 包函数来获得 2 的提升幂。
return uint64(math.Pow(2, float64(n-1)))
Run Code Online (Sandbox Code Playgroud)
在查看了社区解决方案后,我找到了一个使用位移实现相同功能的解决方案:
return uint64(1 << uint(n-1)), nil
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的是,两者之间存在很大的性能差异: 位移 math-pow
我认为 Go 编译器会识别出 math.Pow 使用常数 2 作为基础,并且只使用位移位,而我没有明确这样做。我能看到的唯一其他区别是 float64 和 math.Pow 对浮点数而不是整数的转换。
为什么编译器不优化功率运算来实现类似于位移的性能?