簡體   English   中英

為什么這個C ++程序不使用100%CPU而只使用10%

[英]Why does this C++ program not use 100% CPU but only 10%

這個程序沒有使用所有的CPU功率。 我期待它能夠接管cpu並盡可能快地運行代碼,但它最多只能使用10個

#include <iostream>

using namespace std;

int main(void) {
    unsigned long long x = 600851475143;
    unsigned long long i = x-1;

    while(i <= x) {
            cout << "\r";
            cout << i;

            if((x % i) == 0) {
                    cout << "\n\n";
                    cout << i;

                    break;
            }

            i--;
    }

    system("pause");
}

它最多只能達到10%

速度可能受輸出設備速度的限制。 如果將輸出通過管道傳輸到磁盤上的文件,它將受到磁盤速度的限制。 如果您只是寫入控制台,它將受到控制台速度的限制。 無論哪種方式,CPU很少會成為極限。

編輯:因為有些人顯然不太了解代碼,也許最好簡化一下。 讓我們通過省略if語句來簡化循環,只留下:

unsigned long long x = 600851475143;
unsigned long long i = x-1;

while(i <= x) {
        cout << "\r";
        cout << i;
        i--;
}

所以,這樣做是從600851475143開始,倒數到0,然后當i回到std::numeric_limits<unsigned long long>::max() (通常為2 64 -1)時停止。

現在,如果我們重新添加if語句,我們通常可以忽略它控制的主體 ,但我們也會在每次迭代時都進行余數運算。 如果沒有這個,CPU的使用率幾乎肯定會大大降低(盡管確切的數字可能很大程度上取決於硬件 - 例如,如果將輸出寫入磁盤,磁盤的持續帶寬將成為控制因素)。

因為您正在通過cout進行阻止I / O調用。 刪除cout語句,它將消耗更多的CPU。

每當線程在I / O操作上被阻塞以完成時,包括等待控制台打印的stdout,線程就是阻塞狀態。 因此,在阻塞操作完成之前,該線程上沒有CPU時間。 stdout,內核和控制台都提供了一點緩沖以防止I / O塊,但最終編程速度足夠快的程序將超過提供的緩沖。

注意。 在Windows上,此程序(刪除了cout打印語句)將僅用作CPU的一個核心。 如果您使用四核,它將僅消耗Windows任務管理器上報告的CPU的25%。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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