[英]Make a loop work with having to cout every i in C++
我正在創建此代碼來確定處理器為學校項目執行此操作所花費的時間。 問題是如果不打印每一個結果,我就無法使我的循環工作,如果我不乘以i來打印每一個a的結果,處理器將跳過該循環。 解決此問題后,我比嘗試對CPU進行基准測試更為艱難,如果我打印所有結果,可能會影響性能或解決操作所需的時間。 我試圖在循環中添加一個if,並且僅在i = 999999時打印一個if,但是它不起作用。 有人可以幫忙嗎?
#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;
}
if
表達式中有一個錯誤。 應該是i == 999999
而不是i = 999999
我沒有足夠的意見要發表,但是我認為您的問題來自您的vars類型。
您應該這樣做:
double time = (double)(stop_s-start_s) * 1000.0 / CLOCKS_PER_SEC;
cout << "time: "<< time;
並將stop_s和start_s的類型更改為clock_t
而不是int
它的優化效果較小,而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;
相關鏈接在這里。
無效的動作將被優化。 循環的內容只會影響在超出范圍之前未使用的局部變量。 (它僅在循環內部)。創建難以優化的測試代碼通常很困難。 另外,您可以保留所需的代碼,但最終會計時其他操作,例如保存結果。 我建議你試試
您可以簡單地拒絕優化,例如使用-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++){
~^~~~~~~~
忽略的是,這是完全合理的, 可以被編譯器計算為代碼,然后在出現的程序中使用,其中的結果直接放。 因此,0ms是進行計算的完全合理的時間。
使用更精確的時鍾,您可能可以觀察到它花費的時間為非零時間,盡管這主要由now
調用的開銷決定
#include <iostream>
#include <chrono>
int main () {
auto start = std::chrono::high_resolution_clock::now();
for(unsigned i=0u;i<1000000u;i++){
unsigned a = i*434243u;
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end-start;
std::cout << "Time: " << diff.count() << " s\n";
int dummy;
std::cin >> dummy;
return 0;
}
時間:1.869e-06 s
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.