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

标签 linux operating-system profiling

我会在 Linux 桌面上测量程序执行时间,比如计算斐波那契数。测量方法可以使用代码中的 time 命令或 clock() 函数,无论如何。我确信在我的电脑上只有这个程序在运行,没有其他重要的程序在运行。我的问题是,如何确保我的测量准确且不受后台程序的影响,例如操作系统中断、调度、桌面渲染等。


我的第一个想法是观察可能干扰测量的每个可疑方面。

如果我担心中断,我应该在我的程序运行期间收集所有中断,并分析它们的开销。

如果我担心调度,我应该分析调度行为,以确保调度程序不会产生额外的开销。

如果我担心桌面渲染,因为我的程序使用 GPU,桌面渲染也使用 GPU,最好禁用此渲染程序。

这有意义吗?或者有什么更好的方法?


相关问题:

How to get an accurate performance measure?

Getting reliable performance measurements for short bits of code

最佳答案

你说得很好,操作系统中断、调度和许多其他事情都会影响程序的性能。但请记住这一点:

当用时间来衡量复杂性之类的东西时,您并不是在寻找具体的衡量标准。假设您有一个在 O(n) 时间内运行的简单 for 循环,您想检查它运行了多长时间。如果您还没有看到时间复杂度,想象一下程序的复杂度与大小成正比,例如 10 个元素应该比 1 个元素“长”10 倍才能完成运行时间。当我说您不是在寻找特定的测量值时,我的意思是您是在寻找计算特定输入尺寸所需的时间与其他输入尺寸相比

所以当你担心操作系统中断之类的事情时,我的建议是做这样的事情:

如果您担心程序的效率,您可以测量它在多次运行过程中所花费的时间,并针对多种输入大小。
例如,计算斐波那契数 100 次(相同的输入),并计算完成每次运行所花费的平均时间。

现在,将输入的大小增加到原始大小的两倍,然后再次进行一系列运行以获得平均运行时间。您会发现,平均而言,更大的输入将花费更长的时间来计算。对所有大小的输入继续这样做,您实际上可以绘制每个输入大小的平均运行时间,这条曲线将粗略地代表您的算法复杂性。它不会是完美的,因为大多数实际函数都不能用 O(n)、O(n^2) 来表示,会有一些系数可能会使曲线看起来很奇怪。

我希望这是有道理的,最后请记住,您应该指定您实际要查找的内容。听起来您正在尝试查找程序的运行时间,但如果您不查看不同的输入大小,那又有什么意义呢?在没有比较的情况下查看特定时间(以实际秒为单位)有什么意义?在没有上下文的情况下显示程序运行了 1 秒是毫无意义的,所以我希望这篇文章能让您更深入地了解如何以更传统的方式显示程序的性能。

关于linux - 如何准确衡量性能,排除后台程序干扰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40008725/

相关文章:

javascript - 将等待光标显示为页面元素

iis-7 - IIS7 分析

linux - fseek char linux 设备

linux - 如何在CentOS 6.5 上搭建一个可以使用最新的shell、diff、vim 等的环境?

assembly - 线性、物理、逻辑和虚拟内存地址有什么区别?

synchronization - 使用信号量实现监视器

profiling - 源代码功率分析

java - 配置 Java GUI 应用程序的响应能力

linux - 文件末尾缺少换行符

c - 在 C 中检测 64 位编译