2

このプログラムはすべての 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%までしか進まない

4

2 に答える 2

9

速度は、おそらく出力デバイスの速度によって制限されます。出力をディスク上のファイルにパイプすると、ディスク速度によって制限されます。コンソールに書き込むだけでは、コンソールの速度によって制限されます。どちらにしても、CPU が限界になることはめったにありません。

編集: 一部の人々は明らかにコードをよく理解していないため、おそらくコードを少し単純化するのが最善です. ifステートメントを省略して、ループを単純化しましょう。

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

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

したがって、これは から開始し、0 までカウントダウンし、 (通常は 2 64 -1)にラップアラウンドすると600851475143停止します。istd::numeric_limits<unsigned long long>::max()

ここで、ステートメントを再度追加すると、それが制御する本体ifをほとんど無視できますが、反復ごとに剰余演算も発生します。それがなければ、CPU 使用率はほぼ間違いなくさらに大幅に低下します (ただし、正確な数値はハードウェアに大きく依存する可能性があります。たとえば、出力をディスクに書き込む場合、ディスクの持続帯域幅が制御要因になります)。

于 2013-02-12T18:23:02.693 に答える
2

coutを介してブロッキングI/O呼び出しを行っているためです。coutステートメントを削除すると、より多くのCPUを消費します。

コンソールの印刷を待機するstdoutを含め、I / O操作の完了時にスレッドがブロックされると、スレッドはブロックされた状態になります。したがって、ブロッキング操作が完了するまで、そのスレッドのCPU時間はありません。stdout、カーネル、およびコンソールはすべて、I / Oブロックを防ぐために少しのバッファリングを提供しますが、最終的には、十分に高速に書き込むプログラムは、提供されるバッファリングを超えます。

ノート。Windowsでは、このプログラム(cout printステートメントが削除されている)は、CPUの最大1つのコアとしてのみ使用されます。クアッドコアを使用している場合、Windowsタスクマネージャーで報告されているように、CPUの25%しか消費しません。

于 2013-02-12T18:24:13.720 に答える