【问题标题】:What's faster? (a+a vs 2*a and more) [closed]什么更快? (a+a vs 2*a 及更多)[关闭]
【发布时间】:2013-07-10 21:00:02
【问题描述】:

在 C/C++ 中,我想知道哪个更快?

int a;
int b = a + a; // this
int b = 2 * a; // or this?

另外,数据类型重要吗? long 呢?我们加起来的次数呢?

(那……)

long a;
long b = a + a + a +a;
long b = 4 *a;

【问题讨论】:

  • 更多地依赖于 CPU 而不是语言。
  • 这很容易尝试使用秒表。如果您之后仍然不知道,为什么不发布您尝试过的内容?
  • 过去 25 年的任何编译器都可以将a + a2 * a 编译成目标架构上最快的编译器。
  • ..哦,你忘了a << 1。 ;)

标签: c++ c performance


【解决方案1】:

相信您的优化编译器。它知道如何以您只能猜测的方式针对特定的 CPU/架构进行优化。如果不参考特定的架构,“x 是否比 y 快?”这样的陈述毫无意义,因为这完全取决于大量因素。

对于性能问题,与我们提供的半知情意见和猜测相比,衡量会更全面地回答问题。

【讨论】:

  • 这个问题的例子不值得再考虑,但是编译器无法优化计算,因为优化的版本不是严格等价的。示例包括将x/2 替换为x>>1(只有程序员知道x≥0 或不关心x≤0 时的差异时才可以这样做),x/5.0 替换为x*0.2,等等。编译器无法自行选择这些优化。
  • @PascalCuoq 总体来说好点,但不好的例子(我更喜欢一些更高级别的优化,以避免这样的低级问题值得花时间处理的印象)。当对位摆弄感兴趣时,您应该使用无符号类型,然后 x/2x>>1 是等效的。虽然浮点表达式重写是优化更改结果的一个很好的例子,但编译器执行该操作,如果要求与 -ffast-math 等效。
  • @delnan 我最喜欢的例子是*p = 1; *q = 2; return *p + *q;,但随后关于从程序员到编译器的信息交流的讨论不适合 SO 注释。 blog.frama-c.com/index.php?post/2012/07/25/… PS:认为 -ffast-math 是一个不好的反例,因为它就像给编译器一个许可证来搞乱所有浮点计算,这与故意选择不一样一个特定的计算可以作为x*0.2 用于其预期目的。
  • @PascalCuoq,是的,我全心全意地同意有些优化是人们应该注意的,并且不会由任何理智的编译器自动执行。也就是说,开始进行此类微优化通常是绝对的最后手段,并且通常通过算法优化或删除别名的使用以使优化器可以做得更好等通常的方法可以找到更大的收益。跨度>
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2012-11-23
相关资源
最近更新 更多