我已决定传球的倍值和由在C基准++用下面的代码进行比较(克++ 5.4.0):定时使用变量通过引用,并通过在C++值传递的
#include <iostream>
#include <sys/time.h>
using namespace std;
int fooVal(int a) {
for (size_t i = 0; i < 1000; ++i) {
++a;
--a;
}
return a;
}
int fooRef(int & a) {
for (size_t i = 0; i < 1000; ++i) {
++a;
--a;
}
return a;
}
int main() {
int a = 0;
struct timeval stop, start;
gettimeofday(&start, NULL);
for (size_t i = 0; i < 10000; ++i) {
fooVal(a);
}
gettimeofday(&stop, NULL);
printf("The loop has taken %lu microseconds\n", stop.tv_usec - start.tv_usec);
gettimeofday(&start, NULL);
for (size_t i = 0; i < 10000; ++i) {
fooRef(a);
}
gettimeofday(&stop, NULL);
printf("The loop has taken %lu microseconds\n", stop.tv_usec - start.tv_usec);
return 0;
}
它由于在执行fooRef
内部的操作时在内存中“查找”了参考值,预计fooRef
执行将花费比fooVal
更多的时间。但事实证明,结果是出乎意料的对我说:
The loop has taken 18446744073708648210 microseconds
The loop has taken 99967 microseconds
,下一次我运行的代码可以生成类似
The loop has taken 97275 microseconds
The loop has taken 99873 microseconds
大多数时候产生的值都接近对方(以fooRef
只是慢一点点),但有时会像第一次运行的输出一样发生爆发(对于fooRef
和fooVal
循环都是如此)。
你能解释一下这个奇怪的结果吗?
UPD:优化已关闭,O0级别。
OMG!你真的等了18446744073708648210微秒吗? – WhiZTiM
To @WhiZTiM 当然不是。它运行得非常快,因为它应该。但数据非常混乱。 –
你打开了优化? –