C++ 在C+;中必须对每个i进行cout,使循环工作+;
我创建此代码是为了计算处理器为学校项目执行此操作所需的时间。问题是我无法在不打印每个a结果的情况下使循环工作,如果我在乘以I时不打印每个a的结果,处理器将跳过循环。在解决了这个问题之后,我想我会尝试对我的CPU进行基准测试,如果我打印每个结果,它可能会影响性能或解决操作所需的时间。我尝试在循环中添加一个if,并且只在I=999999时打印一个if,但它不起作用。有人能帮忙吗C++ 在C+;中必须对每个i进行cout,使循环工作+;,c++,C++,我创建此代码是为了计算处理器为学校项目执行此操作所需的时间。问题是我无法在不打印每个a结果的情况下使循环工作,如果我在乘以I时不打印每个a的结果,处理器将跳过循环。在解决了这个问题之后,我想我会尝试对我的CPU进行基准测试,如果我打印每个结果,它可能会影响性能或解决操作所需的时间。我尝试在循环中添加一个if,并且只在I=999999时打印一个if,但它不起作用。有人能帮忙吗 #include <iostream> #include <ctime> using names
#include <iostream>
#include <ctime>
using namespace std;
int main () {
int start_s=clock();
int i;
for(i=0;i<1000000;i++){
int a = i*434243;
if(i = 999999){
cout<<a;
}
}
int stop_s=clock();
cout << "time: "<< (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000;
cout<<"ms";
system ("pause");
return 0;
}
#包括
#包括
使用名称空间std;
int main(){
int start_s=时钟();
int i;
对于(i=0;i我没有足够的观点来评论,但我认为您的问题来自您的vars类型
你应该这样做:
double time = (double)(stop_s-start_s) * 1000.0 / CLOCKS_PER_SEC;
cout << "time: "<< time;
double time=(double)(停止-启动)*1000.0/时钟/秒;
我没有足够的观点来评论,但我认为你的问题来自你的vars类型
你应该这样做:
double time = (double)(stop_s-start_s) * 1000.0 / CLOCKS_PER_SEC;
cout << "time: "<< time;
double time=(double)(停止-启动)*1000.0/时钟/秒;
如果if
表达式中有错误。应该是i==9999999
而不是i=9999999
如果if
表达式中有错误。应该是i==99999999
而不是i=99999优化的效果较小,但std::cout是一个昂贵的操作。因此,当您从for循环中删除cout时,所需时间不到1毫秒。但是,由于cout执行了数百万次,因此程序的运行速度非常慢,这是预期的行为。您可以在使用“a”的地方添加更多算术操作,并且可以在for循环外打印结果,以便“a”仍然很重要
int i=0;
int a = 0;
for(;i<1000000;i++){
a = i*434243;
a += i;
//cout<<a<<endl;
}
cout<<a<<" " <<i<<endl;
inti=0;
int a=0;
for(;i优化的效果较小,但std::cout是一个昂贵的操作更是如此。因此,当您从for循环中删除cout时,所需时间不到1毫秒。然而,cout执行百万次会使您的程序非常慢,这是预期的行为。您可以在使用的地方添加一些更算术的操作“a”,您可以在for循环之外打印结果,以便“a”仍然有效
int i=0;
int a = 0;
for(;i<1000000;i++){
a = i*434243;
a += i;
//cout<<a<<endl;
}
cout<<a<<" " <<i<<endl;
inti=0;
int a=0;
对于(;i没有影响的操作将被优化。循环的内容只影响一个局部变量,该变量在超出范围之前未被使用。(它仅在循环内部的范围内。)通常很难创建不优化为零的测试代码。或者,您保留所需的代码,但最终也会对其他操作(如保存结果)进行计时。我建议您尝试
- 将“int a;”置于循环之外
- 使用“volatile int a;”
- 生成一个函数并从循环中返回一个结果
- 使循环中的计算依赖于上一个
迭代。例如a=a*a
您可以简单地关闭优化,例如使用-o0。但是,您的性能将很差,并且计时将不能代表在打开优化的情况下编译的正常实际代码。将优化掉没有效果的操作。循环的内容只会影响一个未使用的局部变量oes out scope.(它仅在循环内部的作用域中。)通常很难创建不优化为零的测试代码。或者,您保留所需的代码,但最终也会对其他操作(如保存结果)进行计时。我建议您尝试
- 将“int a;”置于循环之外
- 使用“volatile int a;”
- 生成一个函数并从循环中返回一个结果
- 使循环中的计算依赖于上一个
迭代。例如a=a*a
您可以简单地关闭优化,例如使用-o0。但是,您的性能将很差,并且计时将不能代表在打开优化的情况下编译的正常实际代码。您的循环具有未定义的行为,因此严格来说,任何事情都是允许的
warning: iteration 4946 invokes undefined behavior [-Waggressive-loop-optimizations]
int a = i*434243;
note: within this loop
for(int i=0;i<1000000;i++){
~^~~~~~~~
时间:1.869e-06秒
您的循环具有未定义的行为,因此严格来说,任何行为都是允许的
warning: iteration 4946 invokes undefined behavior [-Waggressive-loop-optimizations]
int a = i*434243;
note: within this loop
for(int i=0;i<1000000;i++){
~^~~~~~~~
时间:1.869e-06秒
它是如何工作的?你期望得到什么输出?你真正得到了什么?如果你删除cout
,当使用优化编译时,编译器会意识到a
的计算没有明显的副作用,并且会删除它。即使没有优化,1000000次乘法运算在2上也不会花费太长时间GHz cpu。撇开代码中的其他错误不谈:这是假设规则的一个基本表现形式:最终无法实现的代码可以被优化掉,只做N次相同的乘法,而没有显示或使用任何结果实现任何结果。关于这一点,有一些问题/答案,例如“正确的"循环所需时间的答案是0毫秒。欢迎使用优化,在优化过程中,微小的更改会产生巨大的差异。@NaW-编译器可以看到,如果只输出一个值,结果是cout,它怎么不工作?您期望得到什么输出?您真正得到了什么?如果您删除cout
,在使用优化编译时,compiler会意识到,a
的计算没有明显的副作用,并且会消除它。即使没有优化,1000000次乘法运算在2GHz的cpu上也不会花费太长时间。抛开代码中的其他错误:这是“好像”规则的一个基本表现形式:最终什么都得不到的代码可以优化y、 只做N次相同的乘法,而不显示结果或对结果做任何操作都不会产生任何效果。关于这一点,有一些问题/答案,例如循环所需时间的“正确”答案是0毫秒。欢迎来到优化,这里有一些小的变化