每次重新运行程序时性能都会发生显着变化

Performance changes significantly every time I rerun program

我有一个类似 Rasberry PI 的硬件,它有一个基本的 linux 操作系统和一个名为 运行ning 的程序 "Main_Prog"。

每次我 运行 再次进行性能测试时 Main_Prog 我得到的性能波动小于 1%。这是完全可以接受的。

当我使用 kill 命令杀死 Main_Prog 并重新启动 Main_Prog 时,性能变化高达 8%。进一步的性能测试将围绕此波动变化小于 1%。


例子

例如,如果 Main_Prog 首先 运行 在 100 calls/sec 之间变化 99-101 calls/sec.

然后我对 Main_Prog 执行了 "kill" 命令并使用“./Main_Prog &”重新启动。然后我 运行 进行了性能测试,现在 Main_Prog 是 运行ning 105 calls/sec104-106 calls/sec波动。它将继续 运行 104-106 calls/sec 直到我杀死 Main_Prog 并启动它。


知道如何防止波动或发生了什么吗?请记住,它是非常一致的。操作系统上没有其他程序 运行ning。

您的临时波动可能与page cache. I would not bother (the change is insignificant). See also http://www.linuxatemyram.com/

有关

您可以预先填充页面缓存,例如通过 运行 一些 wc Main_Prog 在 运行 ./Main_Prog

之前

而且您的 Raspberry Pi 上可能还有一些其他 executable programs & processes(检查 topps auxw)。我猜 /sbin/init 在 pid 1 仍然是 运行。可能你的 shell 也是 运行。

只有一个进程的 Linux 系统是很不寻常的。为此,您应该将 /sbin/init 替换为您的程序,我真的不建议这样做,尤其是当您不太了解 Linux 时。

由于您的盒子中有多个进程 运行,并且由于内核 scheduler is preempting 在任意时刻执行任务,因此其行为无法完全重现,这解释了观察到的波动。

另请阅读有关 real-time scheduling, setpriority(2), sched_setscheduler(2), pthread_setschedparam(3), readahead(2), mlock(2), madvise(2), posix_fadvise(2)

的更多信息

如果您最感兴趣的是基准测试,明智的方法是多次重复相同的基准测试(例如 4 到 15 次),然后取最小值、最大值或平均值。