为什么此代码在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答案。
谢谢!
答案 0 :(得分:3)
您明确要求编译器使用-O0
生成未优化的代码。结果确实相当慢,因为嵌套循环没有得到优化。 Java编译器可能会这样做,并删除了空循环,这是一个相当容易的优化。如果您可能要求Java编译器生成未优化的字节码并阻止运行时JIT将其运行,则结果肯定会更慢。
您可以使用Godbolt的Compiler Explorer并查看优化器的效果,将-O0
更改为-O1
,-O2
和-O3
:https://godbolt.org/g/CyWuhB < / p>