此程序未使用所有cpu电源。 我期待它接管cpu并尽可能快地运行代码,但它只使用10 max
#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%
答案 0 :(得分: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
语句,我们通常可以忽略它控制的 body ,但我们也会在每次迭代时都进行余数运算。如果没有这个,CPU的使用率几乎肯定会大大降低(尽管确切的数字很可能在很大程度上取决于硬件 - 例如,如果将输出写入磁盘,磁盘的持续带宽将是控制因素)。
答案 1 :(得分:1)
因为您通过cout进行阻止I / O调用。删除cout语句,它将消耗更多的CPU。
每当线程在I / O操作上被阻塞以完成时,包括等待控制台打印的stdout,该线程就是阻塞状态。因此,在阻塞操作完成之前,该线程上没有CPU时间。 stdout,内核和控制台都提供一点缓冲来防止I / O块,但最终编写的程序速度足以超过提供的缓冲。
请注意。在Windows上,此程序(删除了cout打印语句)将仅用作CPU的一个核心。如果您使用的是四核,它将仅消耗Windows任务管理器上报告的CPU的25%。