为什么后缀增量比C ++中的前缀增长得快?

时间:2018-03-27 08:12:16

标签: c++

我一直认为,必须相反。但是当我尝试这个简单的代码时,我得到了意想不到的结果:

#include <cstdlib>
#include <cstdio>

#include <iostream>

#include <chrono>

using namespace std;


int main(int argc, char* argv[])
{
  int x = 0, y = 0;
  double z;
  chrono::steady_clock::time_point start_point;

  start_point = chrono::steady_clock::now();

  for(int i = 0; i < 100000; x = ++i)
    for(int j = 0; j < 100000; y = ++j)
      z = static_cast<double>(x * y);

  cout << "The prefix increment took a " << chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - start_point).count() << " milliseconds" << endl;

  start_point = chrono::steady_clock::now();

  for(int i = 0; i < 100000; x = i++)
    for(int j = 0; j < 100000; y = j++)
      z = static_cast<double>(x * y);

  cout << "The postfix increment took a " << chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - start_point).count() << " milliseconds" << endl;

  // To make the compiler happy...
  x = y = static_cast<int>(z / z);

  cout << "SUCCESS" << endl;
  return EXIT_SUCCESS;
}

在我的机器上运行此代码的结果是:

The prefix increment took a 25716 milliseconds
The postfix increment took a 19119 milliseconds
SUCCESS

修改

是的,将z = ...更改为z += ...导致执行时间变得相等。

非常感谢大家的回答。

2 个答案:

答案 0 :(得分:13)

完全没有区别 - 任何感知差异都是由于您的测试技术引入的伪影。

编译器多年来一直在优化i++(尽管我仍习惯使用++i)。不要测试这样的事情 - 建立一个框架太难了。简化程序并检查生成的程序集。

另请注意,在具有32位int(非常常见)的平台上,由于int溢出(100,000平方大于31 <},代码的行为未定义sup> st 2的力量。这会使您的测试完全无法使用

答案 1 :(得分:7)

只添加几个Bathsheba has already said,两者

RuleEngineService

DefaultRuleEngineSystemSetup.onEvent(final AfterInitializationEndEvent event)

汇编到

int i;
i++

其中增加值的重要行是

int i;
++i

在回答有关优化的评论时,上面的代码是优化关闭;使用push rbp mov rbp, rsp add DWORD PTR [rbp-4], 1 会导致

add DWORD PTR [rbp-4], 1
^^^                   ^^^
relevant             parts

适用于-Oadd DWORD PTR [rdi], 1 ^^^ ^^^ relevant parts 。 我不得不调整样本

i++

因为它没有被完全优化,但重点仍然是相同的。

我使用了++i。使用Online Compiler Explorer自行测试。