首页 > 解决方案 > 在 C++ 中表现不佳。怎么了?

问题描述

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

谢谢!

标签: c++performancefor-loop

解决方案


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

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


推荐阅读