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--;
}

所以,它的作用是从 开始600851475143,倒数到 0,然后在i回绕到std::numeric_limits<unsigned long long>::max()(通常是 2 64 -1)时停止。

现在,如果我们if重新添加语句,我们几乎可以忽略它控制的主体,但我们也确实会在每次迭代时发生余数运算。没有它,CPU 使用率几乎肯定会大大降低(尽管确切的数字可能在很大程度上取决于硬件——例如,如果您将输出写入磁盘,磁盘的持续带宽将是控制因素)。

于 2013-02-12T18:23:02.693 回答
2

因为您正在通过 cout 进行阻塞 I/O 调用。删除 cout 语句,它会消耗更多的 cpu。

每当一个线程在 I/O 操作完成时被阻塞,包括等待控制台打印的 stdout,线程就处于阻塞状态。因此,在阻塞操作完成之前,该线程上没有 CPU 时间。标准输出、内核和控制台都提供了一点缓冲来防止 I/O 阻塞,但最终一个写得足够快的程序会超过所提供的缓冲。

笔记。在 Windows 上,这个程序(删除了 cout 打印语句)最多只能使用一个 CPU 核心。如果您使用的是四核,则它只会消耗 Windows 任务管理器上报告的 25% 的 CPU。

于 2013-02-12T18:24:13.720 回答