我正在创build一个testing程序来testing计算CPU利用率的程序的function。
现在我想在CPU利用率为100%,50%0%等的不同时间testing该程序
我的问题如何使CPU利用率达到100%或可能达到80%以上。
我认为创build一个while循环就足够了
while(i++< 2000) { cout<<" in while "<< endl; Sleep(10); // sleep for 10 ms. }
运行后,我不会得到高CPU使用率。 什么是可能的解决scheme,使高cpu密集?
你是正确的使用循环,但是:
基本上这个循环中的任何事情都不会花费太多的CPU时间,而与睡眠或等待IO的时间相比。
杀死一个CPU,你只需要给CPU一些东西。 唯一棘手的事情就是确保C ++编译器不会优化掉循环。 像这样的东西应该可以没问题:
// A bit like generating a hashcode. Pretty arbitrary choice, // but simple code which would be hard for the compiler to // optimise away. int running_total = 23; for (int i=0; i < some_large_number; i++) { running_total = 37 * running_total + i; } return running_total;
请注意,我将该值从循环中返回。 这应该阻止C ++编译器注意到循环是无用的(如果你从未在任何地方使用这个值,那么循环就没有用处)。 你可能想要禁用内联,否则我想有一种可能性,一个聪明的编译器会注意到你调用函数而不使用返回值,并将它内联到任何东西。 (Suma在回答中指出,调用函数时使用volatile
禁用内联。)
你的循环大多睡觉,这意味着它有非常轻的CPU负载。 除了睡眠之外,一定要包括执行任何计算的循环,像这样(因子实现留给读者练习,你可以用其他非平凡的函数代替它)。
while(i++< 2000) { int sleepBalance = 10; // increase this to reduce the CPU load int computeBalance = 1000; // increase this to increase the CPU load for (int i=0; i<computeBalance; i++) { /* both volatiles are important to prevent compiler */ /* optimizing out the function */ volatile int n = 30; volatile int pretendWeNeedTheResult = Factorial(n); } Sleep(sleepBalance); }
通过调整sleepBalance / computeBalance,你可以调整这个程序需要多少CPU。 如果您想将其作为CPU负载模拟,您可能需要执行一些附加步骤:
在Windows SDK中使用consume.exe。
当其他人已经完成工作时,不要推出自己的产品,并免费赠送给您。
如果你在你的循环中调用Sleep,那么大部分循环的时间将会无用(睡眠)。 这就是为什么你的CPU使用率很低 – 因为与每次循环迭代中CPU执行其余代码的时间相比,10mS的睡眠是巨大的。 编写代码来准确浪费CPU时间是一项不平凡的任务。 Roger建议使用CPU Burn-In是一个好主意。
我知道UNIX系统上的“yes”命令,当路由到/ dev / null时,会在单个内核上占用100%的CPU(它不会线程化)。 您可以启动它的多个实例来利用每个核心。 你也许可以在应用程序中编译“是”代码并直接调用它。 你没有指定你在Windows上使用的C ++编译器,但是我将假定它具有某种类型的POSIX兼容性(ala Cygwin)。 如果是这样,“是”应该可以正常工作。
为了使一个线程使用大量的CPU,确保它不会阻塞/等待。 您的睡眠呼叫将暂停该线程,而不是至少计划睡眠呼叫指示的毫秒数,在此期间不会使用CPU。
获取CPU烧录的副本。