为什么这段代码在C++中需要3.87秒?
#include <stdio.h>
#include <time.h>
int main() {
int iterations=999999;
int size=1000;
int i,k;
clock_t tStart = clock();
for (k=0;k<iterations;k++){
for(i=0; i<size; i++){
//ANYTHING (the content is not important)
}
}
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
return 0;
}
我在Ubuntu 16上的Eclipse上使用它。这是Eclipse用来编译它的命令:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/myexample.d" -MT"src/myexample.o" -o "src/myexample.o" "../src/myexample.cpp"
我在Java上尝试了同样的代码,只需要0.006秒。
我做错了什么?
谢谢!
编辑
对不起,我不想说Java比C++更好。我只是希望在C++中获得更好的结果,并且我想知道为什么我获得了糟糕的性能,所以我尝试了用Java语言编写相同的代码。
已解决的
使用-O3,我得到了毫秒。
再次编辑
是的,我知道这是一个嵌套循环,但不用担心。我知道我在做什么(代码被简化以阐明问题,在完整版本中它要复杂得多)。错误在编译器命令中。阅读@chqrlie答案。
谢谢!
发布于 2018-06-22 05:26:58
您显式地要求编译器使用-O0
生成未优化的代码。结果确实相当慢,因为嵌套的循环没有得到优化。java编译器可能会这样做,并删除空循环,这是一个相当容易的优化。如果您可以要求java编译器生成未优化的字节代码,并阻止运行时对其执行JITing操作,结果肯定会更慢。
您可以使用Godbolt来查看优化器的效果,将-O0
更改为-O1
、-O2
和-O3
:https://godbolt.org/g/CyWuhB
https://stackoverflow.com/questions/50977557
复制相似问题