让程序慢慢运行
有没有办法通过更改Linux中的任何操作系统参数来更慢地运行C ++程序? 通过这种方式,我想模拟如果某个特定的程序碰巧运行在一台真正的较慢的机器上会发生什么情况。
换句话说,一个更快的机器应该作为一个特定程序的较慢的机器。
- 使用
nice
(和/或renice
)降低优先级。 您也可以使用nice()
系统调用以编程方式执行此操作。 这不会降低执行速度本身,但会使Linux调度程序分配更less(甚至更短)的执行时间帧,更经常地抢占等。有关调度的更多详细信息,请参阅了解Linux内核的进程调度(第10章) 。 - 您可能需要增加定时器中断频率,以使内核承受更多的负载,从而减慢一切。 这需要重build内核。
- 您可以使用
cpufreq-set
命令使用CPU频率调整机制(需要内核模块)和控制(减慢,加速)CPU。 - 另一种可能性是调用
sched_yield()
,它会在程序的性能关键部分(需要更改代码)中对其他进程产生量子sched_yield()
。 - 你可以使用LD_PRELOAD来挂钩像
malloc()
,free()
,clock_gettime()
等常用函数,并做一些愚蠢的东西,比如用rep; hop;
烧几百万个CPU周期rep; hop;
rep; hop;
,插入记忆障碍等等。这会使程序变慢。 (请参阅这个答案的例子,如何做这些东西)。 - 正如@Bill所提到的,你可以在一个虚拟化软件中运行Linux,它允许你限制分配的CPU资源,内存等。
- 如果你真的想让你的程序变慢,在Valgrind下运行(也可以帮助你在应用程序中发现一些问题,比如内存泄漏,内存引用不良等)。
- 有些缓慢可以通过重新编译禁用优化的二进制(即
-O0
和启用断言(即-DDEBUG
))来实现。 - 你可以随时购买一台旧电脑或一台便宜的上网本(比如一台笔记本电脑每个孩子 ,不要忘了一旦你完成testing就把它捐给一个孩子),然后运行你的程序。
希望能帮助到你。
QEMU是Linux的CPU模拟器。 Debian有它的包(我想大多数发行版将会)。 您可以在模拟器中运行一个程序,其中大部分应该支持减慢速度。 例如, Miroslav Novak已经有补丁减缓QEMU。
或者,你可以交叉编译到另一个CPU-linux(arm-none-gnueabi-linux等),然后让QEMU翻译该代码运行。
好的build议很简单,如果将它与另一个将消耗CPU的进程相结合,可能会有效。
nice -19 test & while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
你没有说如果你需要graphics,文件和/或networkingI / O? 你知道你正在寻找的错误类吗? 这是一个竞争条件,还是代码在客户现场performance不佳?
编辑:您也可以使用STOP和CONT等信号来启动和停止程序。 debugging器也可以这样做。 问题是代码全速运行 ,然后停止。 Linux调度程序的大多数解决scheme都会遇到这个问题。 英特尔公司有一些线程分析器。 我看到Vtune发行说明 。 这是Vtune,但我很确定有另一个工具来分析线程竞赛。 请参阅: 英特尔线程检查器 ,它可以检查一些线程竞争条件。 但是我们不知道该应用是否是multithreading的?
使用cpulimit
:
Cpulimit是一个限制进程CPU使用率的工具 (以百分比而不是CPU时间表示)。 当你不希望他们吃太多的CPU周期时,控制批量作业是有用的。 目标是防止进程运行超过指定的时间比例。 它不会更改nice值或其他调度优先级设置,但会改变实际的CPU使用率 。 此外,它能够自动适应整个系统负载 ,dynamic和快速。
使用的CPU数量的控制完成发送SIGSTOP和SIGCONT POSIX信号进程。
所有subprocess和指定进程的线程将共享相同的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
- 得到一台旧电脑
- VPS托pipe软件包往往运行缓慢,有很多中断和大幅变化的延迟。 越便宜,硬件就越差。 与真正的旧硬件不同的是,它们很可能包含通常在旧硬件上找不到的指令集(SSE4)。 Neverthless,如果你想要一个经常慢慢走路的系统,便宜的VPS主机将是最快的开始。
如果你只是想模拟你的程序来分析它在非常慢的机器上的行为,你可以尝试让你的整个程序作为其他主程序的thread
来运行 。
以这种方式,您可以同时在几个线程中优先考虑具有不同优先级的相同代码,并收集分析的数据。 我在游戏开发中使用了这个来进行帧处理分析。
使用睡眠或等待你的代码。 它不是最明智的做法,但在各种不同速度的电脑中都可以接受。
最简单的方法是将主要的可运行代码封装在一个while循环中,并在其结尾处进行睡眠。
例如:
void main() { while 1 { // Logic // ... usleep(microseconds_to_sleep) } }
正如人们所提到的,这不是最准确的方法,因为你的逻辑代码仍然以正常速度运行,但是在运行之间有延迟。 此外,它假定你的逻辑代码是循环运行的东西。
但它既简单又可configuration。