让程序运行缓慢

时间:2013-01-17 02:28:14

标签: c++ c linux unix ubuntu

有没有办法通过更改Linux中的任何操作系统参数来减慢运行C ++程序的速度?通过这种方式,我想模拟如果特定程序碰巧在真正较慢的机器上运行会发生什么。

换句话说,更快的机器应该表现为该特定程序的较慢机器。

7 个答案:

答案 0 :(得分:144)

  • 使用nice(和/或renice)降低优先级。您也可以使用nice()系统调用以编程方式执行此操作。这不会降低执行速度本身,但会使Linux调度程序分配更少(可能更短)的执行时间帧,更频繁地抢占等等。有关调度的更多详细信息,请参阅Process Scheduling (Chapter 10) of Understanding the Linux Kernel
  • 您可能希望increase the timer interrupt frequency对内核施加更多负载,这反过来会减慢一切。这需要内核重建。
  • 您可以使用CPU Frequency Scaling机制(需要内核模块)并使用cpufreq-set命令控制(减慢,加速)CPU。
  • 另一种可能性是在程序的性能关键部分调用sched_yield(),这将为其他进程提供量子(需要更改代码)。
  • 您可以使用LD_PRELOAD挂钩malloc()free()clock_gettime()等常用功能,并执行一些愚蠢的操作,例如使用{{刻录几百万个CPU周期1}},插入内存屏障等。这肯定会减慢程序的速度。 (有关如何执行此操作的示例,请参阅this answer。)
  • 正如@Bill所提到的,你总是可以在虚拟化软件中运行Linux,它可以限制分配的CPU资源,内存等。
  • 如果您真的希望程序运行缓慢,请在Valgrind下运行它(也可以帮助您在应用程序中发现一些问题,如内存泄漏,内存不良引用等)。
  • 通过使用禁用的优化重新编译二进制文件(即rep; hop;并启用断言(即-O0),可以实现一些缓慢。
  • 您可以随时购买一台旧PC或便宜的上网本(如One Laptop Per Child,并且在完成测试后不要忘记将它捐赠给一个孩子,并使用慢CPU并运行您的程序。) LI>

希望它有所帮助。

答案 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)

  1. 获取旧电脑
  2. VPS托管软件包往往运行缓慢,中断很多,延迟时间也各不相同。你的硬件越便宜越硬。与真正的旧硬件不同,它们很可能包含通常在旧硬件上找不到的指令集(SSE4)。毫无疑问,如果你想要一个经常走路和快门走路的系统,便宜的VPS主机将是最快的开始。

答案 4 :(得分:3)

如果您只想模拟程序以分析其在非常慢的机器上的行为,您可以尝试使整个程序作为其他主程序的thread运行。< / p>

通过这种方式,您可以同时在几个线程中优先处理具有不同优先级的相同代码,并收集分析数据。我在游戏开发中使用它来进行帧处理分析。

答案 5 :(得分:2)

使用sleep或等待代码内部。它不是最明亮的方式,但在各种速度不同的计算机上都可以接受。

答案 6 :(得分:2)

最简单的方法是将主要的可运行代码包装在while循环中,并在其末尾进行休眠。

例如:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

正如人们所说,这不是最准确的方法,因为您的逻辑代码仍将以正常速度运行,但运行之间会有延迟。此外,它假定您的逻辑代码是循环运行的东西。

但它既简单又可配置。