如何加电?是否值得使用pow(x,2)?

use*_*422 7 c++ c++11

进行乘法比在c ++中提高功率2更有效吗?

我正在尝试做最后的详细优化.编译器会将x*x与pow(x,2)相同吗?如果我没记错的话,乘法因某种原因更好,但也许在c ++ 11中并不重要.

谢谢

Joh*_*ica 20

如果您将乘法与pow()标准库函数进行比较,则是,乘法肯定更快.


Nik*_*lis 6

我一般情况下,你不应该担心像这样的微微优化,除非你有证据证明存在热点(即除非你在现实场景下描述了你的代码并且已经确定了特定的代码块.另外请记住你的聪明技巧实际上可能导致你的假设不再适用的新处理器的性能回归.

算法变化是您获得计算优势的最佳选择.专注于此.

摆弄乘法并做一些聪明的比特hackery ......呃那里没有那么多*因为当前一代的优化编译器在他们的工作中非常出色.这并不是说他们无法被击败.他们可以,但不是很容易,可能只有少数人喜欢Agner Fog.

*当然也有例外.

  • 还要注意对编译器的盲目信任:即使是十年前,大多数人都认为编译器在他们今天仍然没有的规模上进行了优化.(在微优化级别,指令调度仍然可以从重新排序源代码行中获益!)pow()很少被整数内在函数替换:通常完整的int-> float-> pow-> int完成,而pow不能优化因为fp数学不是关联的.快速测试:使用GCC 4.8,pow(i,2)和i*i一样快,但pow(i,4)比i*i*i*i慢115倍.使用Clang 3.3,它的速度要慢337倍,因为它可以更好地优化乘法. (2认同)
  • 刚刚看到你的评论:你去的微优化是一种非常缓慢/非生产性的编码方式,特别是如果你被带走并编写不可读的bit-twiddling代码(这可能无济于事),或者你花了很多钱在分析之前编写不可读的"优化"从来都不是一个好主意,但是如果你在两个同样易读的版本的代码库中传播的惯用代码之间做出决定,那么就要尽早投入"习惯性学习".过程"可能是明智的......即使这意味着第一次出现微优化问题. (2认同)

And*_*owl 5

在性能方面,总是进行测量以备份您的假设.除非你有一个证明理论正确的基准,否则永远不要相信理论.

另外,请记住,在C++ x ^ 2不会产生2的平方:

#include <iostream>

int main()
{
    int x = 4;
    std::cout << (x ^ 2); // Prints 6
}
Run Code Online (Sandbox Code Playgroud)

实例.