使程序运行缓慢


102

有什么方法可以通过更改Linux中的任何OS参数来减慢C ++程序的运行速度?这样,我想模拟一下,如果该特定程序恰好在速度较慢的计算机上运行,​​将会发生什么情况。

换句话说,对于该特定程序,速度更快的计算机应表现为速度较慢的计算机。


5
您可以使用'nice'来给它一个非常低的优先级-不是确定的事情,但是可能会有所帮助!
John3136 2013年

7
使用另一个旋转处理器的程序在vm中运行它。
thang

12
nice是降低调度优先级的命令。变化古老,相对粗糙。您可以查看调度优先级,但是如果计算机不忙于做其他事情,您的程序仍将快速运行。因此,它可能不会提供足够的帮助。
乔纳森·莱夫勒

9
您必须记住,计算机随时都有很多正在运行的进程,因此使您的应用运行速度变慢不会特别有用。如果您想查看应用程序在糟糕的硬件上的性能,那么您应该获取该糟糕的硬件或暂时更改硬件的BIOS设置以使其变得糟糕。一些BIOS使您可以禁用额外的内核并降低CPU的时钟频率。
Mike Trusov

23
取消按下“涡轮”按钮!
SoftDev

Answers:


145
  • 使用nice(和/或renice)降低优先级。您也可以使用nice()系统调用以编程方式进行操作。这本身不会降低执行速度,但是会使Linux调度程序分配更少(可能更短)的执行时间帧,更频繁地抢占,等等。有关调度的更多详细信息,请参见了解Linux内核的进程调度(第10章)。
  • 您可能希望增加计时器中断频率,以增加内核的负担,这反过来会减慢所有操作的速度。这需要内核重建。
  • 您可以使用CPU Frequency Scaling机制(需要内核模块)并使用以下cpufreq-set命令控制(减速,加速)CPU 。
  • 另一种可能是调用sched_yield(),这将在程序的性能关键部分(需要代码更改)产生其他进程的数量。
  • 您可以钩状常用功能malloc()free()clock_gettime()使用等LD_PRELOAD,并做一些愚蠢的东西一样烧了几百万的CPU周期rep; hop;,插入记忆障碍等,这将减缓为确保程序。(请参阅此答案以获取有关如何执行其中某些操作的示例)。
  • 如@Bill所述,您始终可以在虚拟化软件中运行Linux,该软件可以限制分配的CPU资源,内存等的数量。
  • 如果您确实希望程序运行缓慢,请在Valgrind下运行它(也可以帮助您在应用程序中发现一些问题,例如内存泄漏,错误的内存引用等)。
  • 通过使用禁用的优化功能(即-O0启用断言(即-DDEBUG))重新编译二进制文件,可以实现一定程度的速度降低。
  • 您总是可以购买一台旧PC或一台便宜的上网本(例如“每个孩子一台笔记本电脑”,并且在测试完成后不要忘记将其捐赠给孩子)并运行CPU。

希望能帮助到你。


15
+1:各种建议,包括每个建议的基本要求
lxop 2013年

4
启用调试符号(-ggdb3)并没有减慢二进制文件的执行。它只是使其变得更大。
caf 2013年

11
+1 esp。,用于“ ...购买一台旧PC或一台便宜的上网本...,并且一旦完成测试,别忘了将它捐赠给孩子”
Kris 2013年

3
您可以编辑答案以显示如何模拟不同类型的“慢速”吗?I / O速度慢,CPU速度慢,内存速度慢,内存颠簸等
原因有所不同

3
弗拉德+1。如果您拥有支持的CPU和linux内核,那么cpufreq可能很容易做到。这应该具有指令级别的粒度。如果不购买新硬件,这可能是最好的通用答案。它不会模拟速度较慢的网络,磁盘,视频等,也可能导致比赛。
artless的噪音

36

QEMU 是用于Linux的CPU仿真器。Debian有它的软件包(我想大多数发行版都可以)。您可以在模拟器中运行程序,其中大多数应支持减慢速度。例如, Miroslav Novak具有可降低QEMU速度的补丁程序。

或者,您可以交叉编译到另一个CPU-linux(arm-none-gnueabi-linux等),然后让QEMU将该代码转换为运行。

漂亮的建议很简单,如果你与另一个进程,这将消耗CPU结合它可能工作。

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

您没有说是否需要图形,文件和/或网络I / O?您是否了解所要寻找的错误类别?是竞争条件,还是代码只是在客户现场表现不佳?

编辑: 您还可以使用STOPCONT之类的信号来启动和停止程序。调试器也可以这样做。问题是代码会全速运行,然后停止。Linux调度程序的大多数解决方案都会出现此问题。 有一种来自Intel afair的线程分析器。我看到了Vtune发行说明。这是Vtune,但我很确定还有另一种分析线程竞争的工具。 请参阅:Intel Thread Checker,它可以检查某些线程竞争情况。但是我们不知道该应用程序是否是多线程的吗?


1
并且bochs是较旧且较慢的cpu模拟器(仅x86)。
osgx

22

用途cpulimit

Cpulimit是一种工具,用于限制进程的CPU使用率(以百分比表示,而不是以CPU时间表示)。当您不希望批处理作业占用过多的CPU周期时,控制批处理作业很有用。目的是防止进程运行超过指定的时间比率。它不会更改nice值或其他调度优先级设置,但会更改实际的CPU使用率。而且,它能够动态,快速地适应整个系统的负载

通过将SIGSTOP和SIGCONT POSIX信号发送到进程来完成对已使用cpu量的控制。

所有子进程和指定进程的线程将共享相同百分比的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

我尚未测试cpulimit,但似乎是SE网站上类似问题的最佳答案。在由cpulimit施加限制的情况下运行的程序与在较慢的硬件上运行的程序之间是否有显着差异?我的目标是测试一个应用程序,以确保该应用程序在较慢的计算机上具有足够的响应速度(并针对较慢的计算机调低图形)。
trusktr

@trusktr在很大程度上取决于该程序的实际作用。与较旧的硬件无关,我可以想到磁盘速度和可用内存(RAM)也会影响性能,并且在图形,GPU方面也是如此。可能还有更多。如果CPU实际上是瓶颈,则cpulimit可能仍然值得尝试。(这个答案
已有

有趣。没错,我没有考虑HDD或GPU。我认为使用实际速度较慢的硬件进行测试是最好的方法,但是目前我只有一个功能强大的工作站,尽管我甚至希望针对低端手机(JS + WebGL应用程序)进行发布。
trusktr

13
  1. 换一台旧电脑
  2. VPS托管程序包往往运行缓慢,存在很多中断,并且延迟也千差万别。您越便宜,硬件就会越差。与真正的旧硬件不同,它们很有可能会包含通常在旧硬件上找不到的指令集(SSE4)。但是,如果您希望系统缓慢行走且经常关闭,那么便宜的VPS主机将是最快的启动方式。

3

如果您只是想模拟程序以分析其在非常慢的计算机上的行为,则可以尝试使整个程序像thread其他主程序一样运行

通过这种方式,您可以一次在几个线程中对具有不同优先级的相同代码进行优先级排序,并收集分析数据。我已在游戏开发中将其用于帧处理分析。


2

在代码中使用sleep或wait。它不是最聪明的方法,但是在各种速度不同的计算机中都是可以接受的。


2

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

例如:

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

就像人们会提到的那样,这不是最准确的方法,因为您的逻辑代码仍将以正常速度运行,但运行之间会有延迟。此外,它还假定您的逻辑代码是循环运行的。

但是它既简单又可配置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.