在C ++中性能下降。怎么了?

时间:2018-06-21 21:17:32

标签: c++ performance for-loop

为什么此代码在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答案。

谢谢!

1 个答案:

答案 0 :(得分:3)

您明确要求编译器使用-O0生成未优化的代码。结果确实相当慢,因为嵌套循环没有得到优化。 Java编译器可能会这样做,并删除了空循环,这是一个相当容易的优化。如果您可能要求Java编译器生成未优化的字节码并阻止运行时JIT将其运行,则结果肯定会更慢。

您可以使用Godbolt的Compiler Explorer并查看优化器的效果,将-O0更改为-O1-O2-O3https://godbolt.org/g/CyWuhB < / p>