我一直认为,必须相反。但是当我尝试这个简单的代码时,我得到了意想不到的结果:
#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 += ...
导致执行时间变得相等。
非常感谢大家的回答。
答案 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
适用于-O
和add DWORD PTR [rdi], 1
^^^ ^^^
relevant parts
。
我不得不调整样本
i++
因为它没有被完全优化,但重点仍然是相同的。
我使用了++i
。使用Online Compiler Explorer自行测试。