【问题标题】:Getting bad performance in C++. What is wrong?在 C++ 中表现不佳。怎么了?
【发布时间】:2018-12-01 07:39:09
【问题描述】:

为什么这段代码在 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++ 时,为什么要标记javac?请避免语言垃圾邮件。
  • 您为什么要为您的c++ 问题标记javac
  • 因为-O0 告诉编译器根本不要优化代码。试试-O2-O3 看看你会得到什么。
  • 由于 OP 没有努力正确地提出问题而投反对票。
  • 你有 2 个大的嵌套循环。你期待什么?

标签: c++ performance for-loop


【解决方案1】:

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

你可以玩一下Godbolt的Compiler Explorer,看看优化器的效果,把-O0改成-O1-O2-O3https://godbolt.org/g/CyWuhB

【讨论】:

  • 我不知道。这就是我问的原因。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多