在我公司,我们经常在CPU压力下测试USB和FireWire设备的性能。
我们运行的测试代码可以加载CPU,它通常用于非常简单的非正式测试,以查看设备性能的变化。
我看了一下这个代码,它是一个简单的循环,它递增一个计数器并根据新值进行计算,将这个结果存储在另一个变量中。
运行单个实例将使用1 / X的CPU,其中X是核心数。
因此,例如,如果我们使用的是8核PC,并且我们希望看到我们的设备如何在50%的CPU使用率下运行,我们可以同时打开四个这样的实例,依此类推...... / p>
我想知道:
是什么决定了CPU耗尽了多少?它是否只是在单线程应用程序中的单个线程上以尽可能快的速度运行所有内容?
有没有办法自愿限制程序可以使用的最大CPU使用率?我可以想到一些“草率”的方法(添加睡眠命令或其他东西),但有没有办法限制说,某些指定百分比的可用CPU或什么?
答案 0 :(得分:6)
同样在QNX (i.e. Blackberry Tablet OS)和LynuxWorks
上如果链接断开,文章名称为:
答案 1 :(得分:1)
答案 2 :(得分:0)
你基本上回答了自己的问题!
烧掉大量CPU的代码的关键特性是它永远不会阻塞任何东西(例如,等待网络或文件I / O),并且永远不会自愿产生其时间片(例如sleep()等)
另一个技巧是代码必须做一些编译器无法优化的东西。因此,很可能你的CPU烧录代码输出基于最后的循环计算,或者简单地编译而没有优化,因此优化器不会想要移除无用的循环。由于您正在尝试加载CPU,因此无论如何都没有任何意义。
正如您所假设的那样,与此描述相匹配的单线程代码将使CPU内核饱和,除非操作系统拥有更多这些进程而不是运行它们的内核 - 然后它将循环调度它们并使用每个进程是100%的一部分。
答案 3 :(得分:0)
问题不在于CPU占用多少时间,而是代码开始执行需要多长时间。只要延迟很低,谁会关心它是空闲还是做低优先级的繁忙工作?
您的问题基本上是使用合成基准测试的结果,可能是为了获得可重复的结果。但是合成基准测试往往会产生无意义的结果,因此重复性是没有意义的。
查看您的错误数据库,查找实际的客户投诉,并使用实际软件和测试硬件来重现实际让某人不满意的情况。与艰难,有意义的性能要求同时开发性能测试。