104

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

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

4

8 回答 8

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

希望能帮助到你。

于 2013-01-17T02:51:46.083 回答
37

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 调度程序的解决方案都会有这个问题。 有某种来自英特尔的线程分析器。我看到了 Vtune 发行说明。这是 Vtune,但我很确定还有另一个工具可以分析线程竞争。 请参阅:英特尔线程检查器,它可以检查某些线程竞争条件。但是我们不知道应用程序是否是多线程的?

于 2013-01-17T02:46:53.670 回答
23

使用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
于 2013-01-17T14:49:39.410 回答
13
  1. 买一台旧电脑
  2. VPS 托管软件包往往运行缓慢,有很多中断,并且延迟差异很大。你买的越便宜,硬件就越差。与真正的旧硬件不同,它们很有可能包含旧硬件上通常找不到的指令集 (SSE4)。尽管如此,如果您想要一个运行缓慢且经常关闭的系统,廉价的 VPS 主机将是最快的开始。
于 2013-01-17T03:06:59.697 回答
3

如果您只是想模拟您的程序以分析它在非常慢的机器上的行为,您可以尝试让您的整个程序作为thread其他一些主程序运行。

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

于 2013-01-24T03:29:42.200 回答
2

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

于 2013-01-17T03:54:22.023 回答
2

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

例如:

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

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

但它既简单又可配置。

于 2013-03-10T06:03:07.323 回答
0

您可以通过启动工具来增加 CPU 的负载,stress例如stress-ng

于 2021-12-26T10:28:14.373 回答