如何获得准确的绩效衡量标准

How to get an accurate performance measure?

本文关键字:标准 何获得      更新时间:2023-10-16

在我们的项目中,我们试图自动监控测试运行的性能,以确保随着时间的推移,程序的性能不会发生任何重大变化。

问题是,我们得到的测量结果似乎有5%的可变性。也就是说,在同一台机器上,使用相同的程序(无需重新编译)运行相同的测试,我们得到的值在不同的运行中相差约5%。这对于我们想要使用这些数字的目的来说太过分了。

我们已经将设置成本排除在计时考虑之外了——也就是说,从C++代码本身来看,我们在运行时间关键部分之前和之后立即获取时间,而不是在操作系统级别上对整个程序进行计时。我们也在进行平均和异常值排除。问题是,可变性看起来也有长期趋势,所以我们对一个接一个的复制时间进行了严格的聚类,但一两个小时后的时间就大不相同了。(不幸的是,将测试分散在几个小时内是不可行的。)测试也在专用机器上运行,而"没有其他东西"在上面运行。

我们不太确定定时变化是从哪里来的,但它可能与处理器和系统有关——有迹象表明,变化的大小取决于程序运行的机器。

有人知道这种变异可能来自哪里,以及如何消除它吗?测试在专用机器上运行,因此可以更改操作系统设置。

(如标签所示,这是一个在x86 Linux系统上运行的C++程序,如果这有助于澄清问题的话。)

编辑:回复评论

我们目前的计时方案是使用C标准库中的clock()函数,查看要测试的函数前后的返回值的差异。

我们测试的代码应该是确定性的,不应该涉及大量的IO

我意识到,对于"银弹"的答案来说,情况有点模糊。我想我更想找一个"这些是需要考虑的重要因素,这是你可能应该检查它们的顺序,下面是你如何检查每一个"类型的答案。

我很惊讶你的变化率降到了5%。

除非你能摆脱系统上运行的所有不必要的东西,否则你会得到很高的变化。这是最高级别的。

您的操作系统需要具有确定性。您需要知道其他哪些任务和线程正在运行,以及它们的持续时间。例如,时钟中断。现在,有多少其他函数被链接到这个中断?这些其他功能是否有所不同?

你的系统是孤立的吗?例如,如果您的系统连接到网络,您的测量值可能会有所不同。

您的程序是否使用外部资源?例如硬盘驱动器。如果程序写入硬盘驱动器,则该驱动器将不具有确定性。文件和部分文件可能会在驱动器上移动。驱动器可能会变得支离破碎。这种碎片可能会导致测量结果出现差异。

操作系统内存可能会碎片化。此外,可执行文件的内存可能会变得支离破碎。碎片化可能会增加差异。