簡體   English   中英

使必須在C ++中退出每個i循環

[英]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;

相關鏈接在這里。

無效的動作將被優化。 循環的內容只會影響在超出范圍之前未使用的局部變量。 (它僅在循環內部)。創建難以優化的測試代碼通常很困難。 另外,您可以保留所需的代碼,但最終會計時其他操作,例如保存結果。 我建議你試試

  • 放入“ 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++){
                 ~^~~~~~~~

忽略的是,這是完全合理的, 可以被編譯器計算代碼,然后在出現的程序中使用,其中的結果直接放。 因此,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM