如何获得准确的绩效衡量标准
How to get an accurate performance measure?
在我们的项目中,我们试图自动监控测试运行的性能,以确保随着时间的推移,程序的性能不会发生任何重大变化。
问题是,我们得到的测量结果似乎有5%的可变性。也就是说,在同一台机器上,使用相同的程序(无需重新编译)运行相同的测试,我们得到的值在不同的运行中相差约5%。这对于我们想要使用这些数字的目的来说太过分了。
我们已经将设置成本排除在计时考虑之外了——也就是说,从C++代码本身来看,我们在运行时间关键部分之前和之后立即获取时间,而不是在操作系统级别上对整个程序进行计时。我们也在进行平均和异常值排除。问题是,可变性看起来也有长期趋势,所以我们对一个接一个的复制时间进行了严格的聚类,但一两个小时后的时间就大不相同了。(不幸的是,将测试分散在几个小时内是不可行的。)测试也在专用机器上运行,而"没有其他东西"在上面运行。
我们不太确定定时变化是从哪里来的,但它可能与处理器和系统有关——有迹象表明,变化的大小取决于程序运行的机器。
有人知道这种变异可能来自哪里,以及如何消除它吗?测试在专用机器上运行,因此可以更改操作系统设置。
(如标签所示,这是一个在x86 Linux系统上运行的C++程序,如果这有助于澄清问题的话。)
编辑:回复评论
我们目前的计时方案是使用C标准库中的clock()函数,查看要测试的函数前后的返回值的差异。
我们测试的代码应该是确定性的,不应该涉及大量的IO
我意识到,对于"银弹"的答案来说,情况有点模糊。我想我更想找一个"这些是需要考虑的重要因素,这是你可能应该检查它们的顺序,下面是你如何检查每一个"类型的答案。
我很惊讶你的变化率降到了5%。
除非你能摆脱系统上运行的所有不必要的东西,否则你会得到很高的变化。这是最高级别的。
您的操作系统需要具有确定性。您需要知道其他哪些任务和线程正在运行,以及它们的持续时间。例如,时钟中断。现在,有多少其他函数被链接到这个中断?这些其他功能是否有所不同?
你的系统是孤立的吗?例如,如果您的系统连接到网络,您的测量值可能会有所不同。
您的程序是否使用外部资源?例如硬盘驱动器。如果程序写入硬盘驱动器,则该驱动器将不具有确定性。文件和部分文件可能会在驱动器上移动。驱动器可能会变得支离破碎。这种碎片可能会导致测量结果出现差异。
操作系统内存可能会碎片化。此外,可执行文件的内存可能会变得支离破碎。碎片化可能会增加差异。
- 正在查找文档以获得PS4平台的C++中的设备信息
- 如何从C++中的依赖类型中获得它所依赖的类型
- 欧拉项目#8答案是大以获得有效答案
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++17标准对在nullptr上调用delete有何规定
- 如何获得准确的绩效衡量标准
- 如何获得标准分类类型的IClassifier
- 关于在矢量上调用clear如何改变容量,标准有何规定
- 什么是"Clean C",它与标准 C 有何不同?
- 如何获得与C++0x标准兼容的Coverity静态分析
- c++在标准输入上写入数据,并从标准输出中获得输出
- 获得标准::复杂<double>通过标准::is_floating_point测试
- 如何在Linux上的c++中将数据管道到bzip2中并从其标准输出中获得结果数据?
- 如何从调用QProcess的程序中获得返回的标准输出
- C++标准对堆栈溢出有何规定
- 编程 Arduino 与标准 C 有何不同
- 获得sizeof(提升(x))的标准方法