在C代码中,通常会写入以下内容:
a = b*b;
替代
a = pow(b, 2.0);
针对double
变量的情况,由于pow
是一个通用函数,能够处理非整数指数,因此很多人可能会认为第一个版本比较快。然而我想知道编译器(gcc)是否会将带有整数指数的pow
调用转换为直接乘法作为可选优化的一部分。
假设这种优化不会发生,那么哪个最大的整数指数可以通过手动写成类似于b*b* ... *b
的乘法来使计算速度更快呢?
我知道我可以在特定的机器上进行性能测试以确定是否需要关注这个问题,但我想更深入地了解什么才是“正确的做法”。
pow()
(我猜您指的是这个函数)不仅仅是一个能够处理非整数指数的函数;它是一个接受double
类型参数并返回double
类型的函数。虽然这是一个有些微妙的点,但参数和返回值的类型与它们可能采用的值一样重要。 - John Bollingerpower
处理的是浮点数值。对于计算整数幂,手动展开b*b ... *b
几乎总是更快的。 - Cody Graygcc
和clang
似乎会将pow(b, 2.0)
转换为b * b
,但b
仍然被视为double类型。(godbolt参考链接)观察mulsd %xmm0,%xmm0
指令。但是,当用3.0替换2.0时,相同的优化似乎不会发生。 - Ben Steffan