【问题标题】:C++ expressions - which one of the two is faster?C++ 表达式 - 两者中哪一个更快?
【发布时间】:2015-07-15 10:35:25
【问题描述】:

我一直在尝试 C++,我对两个脚本的性能特别感兴趣。 一个小介绍:

我有一个名为 Point 的类,用于试验极坐标中给出的点。该类包含两个私有 double 变量,通常的函数 get、set 和公共函数 rotate,它接受一个 double 参数并将其以极坐标形式添加到我们当前的角度,以生成一个新的 Point 对象。

下面是两个不同的函数rotate脚本:

void Point::rotate(double theta) {
    double A = getA();
    A += theta;
    setA(A);
}

void Point::rotate(double theta) {
    setA(getA() + theta);
} 

我的问题很简单:

哪一个实际上更快?为什么?

我知道第一种方法必须使用 getA() 然后将其保存到变量 A 中,因此很可能需要更长的时间/效率更低。 更一般地说,在计算表达式时,是否需要将大部分表达式保存在其他变量中然后使用这些? (夸张地假设写代码的“人”不会出错,以后可能需要阅读代码的每个人都会完全理解。)

一个简单的例子来澄清我的问题:

假设我们要计算 a+b+c。将 a+b 保存在一个新变量中是否更好,比如 d,然后将 d 添加到 c 中?用另一个函数求值调用一个带参数的函数怎么样?

提前致谢!

【问题讨论】:

  • 为什么不测量? (如果真的很重要)
  • 他们可能会产生相同的代码。 (C++ 不是“脚本”,它的“源代码”或只是“代码”)。

标签: c++ performance


【解决方案1】:

这两个表达式是相同的。理想情况下,您始终可以运行一个基准测试,在其中循环多次调用该表达式并查看时间差。

但是,另一种看待它的方式是回答问题的第二部分,它谈到了a+b+c。当代码将被转换为汇编时,a+b 无论如何都会存储在某个寄存器中,然后添加到c,因为汇编中不存在三位数加法的操作。所以,不会有区别:

c =  a + b + c

d = a + b
c = c + d

此外,许多其他优化是由编译器完成的,这导致这些事情没有什么不同。

【讨论】:

  • 不是第一种情况下c(一个变量)入栈,第二种情况下两个变量入栈吗?导致更多的推送/弹出?
  • @fonZ:我的观点是,当转换为汇编时,即使c = a+b+c 也是两个操作,这与第二部分相同。 a+b+c 的计算中会有一个中间变量,但对你隐藏。
  • @fonZ 通常不在生产编译器中。在玩具编译器或像 Tiny C 编译器这样真正未优化的东西中,可能就是这种情况。在 MSVC、GCC、ICC、Clang 等编译器中,通常不会。那些编译器将仔细研究这些表达式并有效地将两者视为同一事物,并且给出如此少的活动变量,通常不会有任何堆栈溢出。快速浏览一下拆卸应该会显示这一点。
  • @fonZ 编译器非常可靠地删除了堆栈上不必要的推送/弹出操作。最后,执行的不是您编写的程序,而是另一个更快但具有相同可观察结果的程序。如果您现在编写程序集,甚至会发生这种情况。
  • 见鬼,现代编译器会查看a+b+c 并检查寄存器中已有的内容。如果 b 和 c 已经在寄存器中但需要加载 a ,它们将重叠 a 的加载和 b+c 的加法,以便在加载完成时只剩下一个加法。这意味着您不能谈论任何孤立代码的速度。使用它的上下文决定了生成的二进制代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多