我会在Linux桌面上测量程序执行时间,比如计算斐波纳契数。无论如何,测量方法可以使用代码中的 time 命令或 clock ()函数。我确信在我的计算机上只有这个程序正在运行,没有其他重要程序在运行。我的问题是,如何确保我的度量准确并且不受后台程序的影响,例如OS中断,调度,桌面渲染等。
我的第一个想法是观察可能干扰措施的每个可疑方面。
如果我担心中断,我应该在编程运行期间收集所有中断,并分析它们的开销。
如果我担心调度,我应该分析调度行为,以确保调度程序不会产生额外的开销。
如果我担心我的程序使用桌面渲染时使用的GPU时桌面渲染,最好禁用此渲染程序。
这有意义吗?还是更好的方法?
相关问题:
How to get an accurate performance measure?
Getting reliable performance measurements for short bits of code
答案 0 :(得分:0)
你提出了一个很好的观点,操作系统中断,调度以及许多其他因素会影响程序的性能。但要记住这一点:
在测量时间方面的复杂性时,您并不是在寻找具体的测量方法。假设您有一个简单的for循环,它在O(n)时间内运行,您要检查并查看它运行了多长时间。如果你还没有看到时间复杂性,想象一下程序的复杂程度与大小成正比,前10个元素应该花费10倍"更长时间"超过1个元素来完成运行时间。当我说你不是在寻找特定的测量时,我的意思是你在寻找计算某些输入尺寸将与其他输入尺寸进行比较所花费的时间
因此,当您担心操作系统中断等问题时,我的建议是做这样的事情:
如果您担心程序的效率,可以测量多次运行过程所需的时间,以及几种输入尺寸。 例如,计算Fibonacci数100次(相同输入),并计算完成每次运行所花费的平均时间。
现在,将输入的大小增加到原始大小的两倍,然后再进行一系列运行以获得平均运行时间。你会发现,平均而言,更大的输入需要更长的时间来计算。继续对所有大小的输入执行此操作,您实际上可以绘制每个输入大小的平均运行时间,此曲线将粗略地表示您的算法复杂度。它不是完美的,因为大多数实际函数不能用O(n),O(n ^ 2)表示,会有一些系数可能使曲线看起来很奇怪。
我希望这是有道理的,作为最后一点,请记住,您应该指定您实际需要的内容。这听起来像是在尝试查找程序的运行时间,但如果您不查看不同的输入大小,那又有什么意义呢?在没有比较的情况下,查看特定时间(实际秒数)的重点是什么?显示程序在1秒内运行在没有上下文的情况下是非常无意义的,所以我希望这篇文章可以让您更加深入地了解如何以更传统的方式显示程序的性能。
答案 1 :(得分:0)
我从Systems Benchmarking Crimes找到了几个基准规则:
此外,基于某些Web搜索,在特定内核上固定线程并设置进程的优先级可以消除调度影响。如果程序消耗很短的时间,例如低于几毫秒,则可以考虑中断影响。否则,它可以忽略不计。