c++ - 在 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 答案。
谢谢!
解决方案
您明确要求编译器生成未优化的代码-O0
。结果确实相当慢,因为嵌套循环没有得到优化。java 编译器可能会这样做并删除空循环,这是一个相当容易的优化。如果您可以要求 java 编译器生成未优化的字节码并阻止运行时对其进行 JIT 处理,那么结果肯定会更慢。
您可以使用 Godbolt 的 Compiler Explorer 并查看优化器的效果,将 和 更改为:-O0
https : //godbolt.org/g/CyWuhB-O1
-O2
-O3
推荐阅读
- css - 如何找到我可以在 ant design 组件中编辑的所有样式属性?
- python - 从父包 Python 导入 - Python 导入错误
- python - Pymodbus TCP `read_holding_registers` 返回陈旧/旧数据
- google-assistant-sdk - 在 Windows 10 上安装 Google Assistant 时出错
- assembly - 如何等到在 NASM 中按下指定的键?
- c# - 如何修复标签页故障?
- vue.js - 如何在nuxt中获取axios baseUrl?
- ios - 如何减少 UICollectionView 上大量项目的内存使用?
- html - 我的@import 查询无法正常工作
- excel - 基于特定数字之间的列标题的平均值