有没有办法通过更改 Linux 中的任何操作系统参数来降低 C++ 程序的运行速度?通过这种方式,我想模拟如果该特定程序碰巧在一台真正速度较慢的机器上运行会发生什么。
换句话说,对于该特定程序,较快的机器应该表现为较慢的机器。
nice
使用(和/或)降低优先级renice
。您也可以使用nice()
系统调用以编程方式执行此操作。这本身不会减慢执行速度,但会使 Linux 调度程序分配更少(并且可能更短)的执行时间帧,更频繁地抢占等。有关调度的更多详细信息,请参阅了解 Linux 内核的进程调度(第 10 章) .cpufreq-set
。sched_yield()
,这将为其他进程产生量子。malloc()
挂钩诸如,等常用函数,并做一些愚蠢的事情free()
,例如使用 烧毁几百万个 CPU 周期、插入内存屏障等。这肯定会减慢程序的速度。(有关如何做这些事情的示例,请参阅此答案)。clock_gettime()
rep; hop;
-O0
通过禁用优化(即启用断言(即)重新编译二进制文件)可以实现一些缓慢-DDEBUG
。希望能帮助到你。
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?您对您要查找的错误类别有所了解吗?这是竞争条件,还是代码在客户站点上表现不佳?
编辑: 您还可以使用STOP和CONT等信号来启动和停止程序。调试器也可以做到这一点。问题是代码全速运行然后停止。大多数使用 Linux 调度程序的解决方案都会有这个问题。 有某种来自英特尔的线程分析器。我看到了 Vtune 发行说明。这是 Vtune,但我很确定还有另一个工具可以分析线程竞争。 请参阅:英特尔线程检查器,它可以检查某些线程竞争条件。但是我们不知道应用程序是否是多线程的?
使用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
如果您只是想模拟您的程序以分析它在非常慢的机器上的行为,您可以尝试让您的整个程序作为thread
其他一些主程序运行。
通过这种方式,您可以一次在几个线程中对具有不同优先级的相同代码进行优先级排序,并收集分析数据。我在游戏开发中使用它来进行帧处理分析。
在代码中使用睡眠或等待。它不是最聪明的方法,但在各种速度不同的计算机中都是可以接受的。
最简单的方法是将您的主要可运行代码包装在一个 while 循环中,并在其末尾休眠。
例如:
void main()
{
while 1
{
// Logic
// ...
usleep(microseconds_to_sleep)
}
}
正如人们会提到的,这不是最准确的方法,因为您的逻辑代码仍会以正常速度运行,但运行之间会有延迟。此外,它假定您的逻辑代码是循环运行的。
但它既简单又可配置。
您可以通过启动工具来增加 CPU 的负载,stress
例如stress-ng