linux - 如何准确测量性能,排除后台程序干扰?

我会在Linux桌面上测量程序执行时间,比如计算斐波那契数。measure方法可以使用代码中的time命令或clock()函数,不管怎样。我确信在我的电脑上只有这个程序在运行,没有其他重要的程序在运行。我的问题是,如何确保我的测量是准确的,而不受后台程序的影响,如操作系统中断、调度、桌面渲染等。
我的第一个想法是观察每一个可能干扰措施的可疑方面。
如果我担心中断,我应该在程序运行期间收集所有中断,并分析它们的开销。
如果我担心调度,我应该分析调度行为,以确保调度程序不会产生额外的开销。
如果我担心桌面渲染,在我的程序使用GPU的情况下,桌面渲染也使用GPU,最好禁用这个渲染程序。
这有道理吗?或者有更好的方法?
相关问题:
How to get an accurate performance measure?
Getting reliable performance measurements for short bits of code

最佳答案

你说得好,操作系统中断、调度等很多事情都会影响你的程序性能。但请记住:
当用时间来衡量复杂程度时,你并不是在寻找具体的测量方法。假设您有一个在O(N)时间内运行的简单for循环,您希望检查它运行多长时间。如果你还没有看到时间复杂度,想象一下程序的复杂性与大小成正比,EX 10个元素应该比1个元素“长”10倍才能完成运行时间。当我说你不是在寻找特定的测量值时,我是说你是在寻找计算特定输入大小所需的时间,而不是其他输入大小
所以当你担心操作系统中断时,我的建议是这样做:
如果你担心程序的效率,你可以测量它在几个运行过程中所花费的时间,以及几个输入大小。
例如,计算一个斐波那契数100次(相同的输入),取每次运行所需的平均时间。
现在,将输入的大小增加到原来大小的两倍,然后再次执行一系列的运行以获得平均运行时间。你会发现,平均来说,一个较大的输入需要更长的计算时间。对于所有大小的输入保持这样做,并且实际上可以绘制每个输入大小的平均运行时间,并且该曲线将大致代表算法复杂性。它不是完美的,因为大多数实际函数不能用o(n),o(n^2)表示,会有一些系数使曲线看起来很奇怪。
我希望这是有意义的,作为最后一点,请记住,你应该具体说明你到底在找什么。听起来你想找出程序的运行时间,但如果你不考虑不同的输入大小,那又有什么意义呢?在没有比较的情况下观察特定时间(以实际秒为单位)有什么意义?显示一个在1秒内运行的程序在没有上下文的情况下是非常没有意义的,所以我希望这篇文章能给你一些关于如何以更传统的方式显示程序性能的更多见解。