有没有办法通过更改Linux中的任何操作系统参数来减慢运行C ++程序的速度?通过这种方式,我想模拟如果特定程序碰巧在真正较慢的机器上运行会发生什么。
换句话说,更快的机器应该表现为该特定程序的较慢机器。
答案 0 :(得分:144)
nice
(和/或renice
)降低优先级。您也可以使用nice()
系统调用以编程方式执行此操作。这不会降低执行速度本身,但会使Linux调度程序分配更少(可能更短)的执行时间帧,更频繁地抢占等等。有关调度的更多详细信息,请参阅Process Scheduling (Chapter 10) of Understanding the Linux Kernel。cpufreq-set
命令控制(减慢,加速)CPU。sched_yield()
,这将为其他进程提供量子(需要更改代码)。malloc()
,free()
,clock_gettime()
等常用功能,并执行一些愚蠢的操作,例如使用{{刻录几百万个CPU周期1}},插入内存屏障等。这肯定会减慢程序的速度。 (有关如何执行此操作的示例,请参阅this answer。)rep; hop;
并启用断言(即-O0
),可以实现一些缓慢。希望它有所帮助。
答案 1 :(得分:36)
QEMU 是Linux的CPU模拟器。 Debian有它的包(我想大多数发行版会)。您可以在模拟器中运行程序,其中大多数应该支持减慢速度。例如,Miroslav Novak有补丁来减慢QEMU。
或者,你可以交叉编译到另一个CPU-linux(arm-none-gnueabi-linux等)然后让QEMU翻译该代码来运行。
nice 建议很简单,如果将它与另一个将消耗cpu的进程结合使用,可能会有效。
nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
您没有说您是否需要图形,文件和/或网络I / O?你知道你正在寻找的 class 错误吗?这是竞争条件,还是代码在客户现场表现不佳?
修改:您还可以使用停止和 CONT 等信号来启动和停止程序。调试器也可以这样做。问题是代码运行全速然后停止。使用Linux调度程序的大多数解决方案都会遇到此问题。 英特尔公司提供了某种线程分析器。我看到Vtune Release Notes。这是Vtune,但我非常确定还有另一种工具来分析线程竞赛。请参阅:Intel Thread Checker,它可以检查一些线程竞争条件。但我们不知道应用程序是否是多线程的?
答案 2 :(得分:19)
使用cpulimit
:
Cpulimit是一个限制进程的CPU使用率的工具(以百分比表示,而不是以CPU时间表示)。当您不希望它们吃太多CPU周期时,控制批处理作业很有用。目标是防止进程运行超过指定的时间比率。它不会更改nice值或其他调度优先级设置,但实际CPU使用率。此外,它还能够动态,快速地自行适应整体系统负载 使用的cpu量的控制完成了向进程发送SIGSTOP和SIGCONT POSIX信号。
所有子进程和指定进程的线程将共享相同的CPU百分比。
它在Ubuntu回购中。只是
apt-get install cpulimit
以下是有关如何在已经运行的程序中使用它的一些示例:
将进程'bigloop'按可执行文件名限制为40%CPU:
cpulimit --exe bigloop --limit 40 cpulimit --exe /usr/local/bin/bigloop --limit 40
通过PID将进程限制为55%CPU:
cpulimit --pid 2960 --limit 55
答案 3 :(得分:13)
答案 4 :(得分:3)
如果您只想模拟程序以分析其在非常慢的机器上的行为,您可以尝试使整个程序作为其他主程序的thread
运行。< / p>
通过这种方式,您可以同时在几个线程中优先处理具有不同优先级的相同代码,并收集分析数据。我在游戏开发中使用它来进行帧处理分析。
答案 5 :(得分:2)
使用sleep或等待代码内部。它不是最明亮的方式,但在各种速度不同的计算机上都可以接受。
答案 6 :(得分:2)
最简单的方法是将主要的可运行代码包装在while循环中,并在其末尾进行休眠。
例如:
void main()
{
while 1
{
// Logic
// ...
usleep(microseconds_to_sleep)
}
}
正如人们所说,这不是最准确的方法,因为您的逻辑代码仍将以正常速度运行,但运行之间会有延迟。此外,它假定您的逻辑代码是循环运行的东西。
但它既简单又可配置。