C++ C++;带/不带”的性能;";
大家好C++ C++;带/不带”的性能;";,c++,C++,大家好 我的问题很简单,但我没有答案。下面你可以看到我的C++代码——它有一点大但很简单——当我用“代码>//STD::CUT”运行代码时,大多数都是一个简单的优化问题:只要你不从循环中产生任何输出,编译器就确定循环基本上是死区代码,根本不执行它们。它需要做一点预计算来确定vector[5].y在循环之后的值,但它完全可以在编译时这样做,所以在运行时,它基本上只是打印出一个固定的数字 当你在循环中产生可见的输出时,编译器不能仅仅消除执行它们,因此代码运行速度会大大降低。亲爱的上帝,为什么?……天
我的问题很简单,但我没有答案。下面你可以看到我的C++代码——它有一点大但很简单——当我用“代码>//STD::CUT
”运行代码时,大多数都是一个简单的优化问题:只要你不从循环中产生任何输出,编译器就确定循环基本上是死区代码,根本不执行它们。它需要做一点预计算来确定
vector[5].y在循环之后的值,但它完全可以在编译时这样做,所以在运行时,它基本上只是打印出一个固定的数字
当你在循环中产生可见的输出时,编译器不能仅仅消除执行它们,因此代码运行速度会大大降低。亲爱的上帝,为什么?……天哪,你怎么会有耐心编写这些嵌套循环呢???!这是因为您的循环只做cout
,编译器可以在没有它的情况下完全删除它。另外,我强烈建议不要使用这种代码生成,你很可能是在攻击一个XY问题。@SergiuVelescu 68719476736额外的循环迭代才是区别所在。@LưuVĩnhPhúc:仔细看,这是一种误导。好吧-我考虑过这个问题-向量[5]呢。y=aal-1在循环中-这不是强制编译器运行这些循环并计算值吗?(最后,我还得出了这个值)看起来循环正在运行,因为当我注释一个循环时,它需要160毫秒才能完成,如果我取消注释,它需要大约1秒钟。看起来循环的一部分仍然存在。也许真正的情况是,在消除了所有积垢的情况下,实际的循环在计算上并不太昂贵。一些编译器可能会比其他编译器更积极地这样做。Clang删除了所有循环,代码在我的PC上以.004s的格式运行,gcc保留了一些循环,并在.8s左右运行。不管是哪种方式,这篇文章的主题应该是“只分析有意义的代码,而仅仅把东西放在一个大循环中并不是一个合适的微基准。”
#include <cstdlib>
#include <iostream>
using namespace std;
struct cell {
int x;
int y;
};
int main(int argc, char** argv) {
cell vector[8];
unsigned long int yy=0;
for (int aaa = 0; aaa < 8; aaa++) {
vector[0].x = aaa;
for (int aab = 0; aab < 8; aab++) {
vector[0].y = aab;
for (int aac = 0; aac < 8; aac++) {
vector[1].x = aac;
for (int aad = 0; aad < 8; aad++) {
vector[1].y = aad;
for (int aae = 0; aae < 8; aae++) {
vector[2].x = aae;
for (int aaf = 0; aaf < 8; aaf++) {
vector[2].y = aaf;
for (int aag = 0; aag < 8; aag++) {
vector[3].x = aag;
for (int aah = 0; aah < 8; aah++) {
vector[3].y = aah;
for (int aai = 0; aai < 8; aai++) {
vector[4].x = aai;
for (int aaj = 0; aaj < 8; aaj++) {
vector[4].y = aaj;
for (int aak = 0; aak < 8; aak++) {
vector[5].x = aak;
for (int aal = 0; aal < 8; aal++) {
vector[5].y = aal;
yy++;
if(yy%10000000000==0){
vector[5].y = aal-1;
//std::cout<<yy<<endl;
}
}
}
}
}
}
}
}
}
}
}
}
}
std::cout<<yy<<endl;
std::cout<<vector[5].y<<endl;
return 0;
}