我看到软件基准测试和性能分析这两个术语有时可以互换使用,但据我所知存在细微的差别。
两者都按时间连接。但是,基准测试主要是要确定可以与其他应用程序进行比较的特定速度得分,而性能分析可以为您提供有关应用程序在大部分时间(或周期数)上花费的确切信息。
对我而言,总像是:集成测试是基准测试的对应部分,而将测试部分组合到性能分析中。但是微基准测试如何适应呢?
有人在这里说:
概要分析和基准测试是同一枚硬币的另一面,概要分析可帮助您缩小到最有用的优化范围,基准测试可让您轻松隔离优化并进行交叉比较。
另一个人在这里谈到了性能分析:
在不同的时间进行概要分析意味着不同的事情。有时,这意味着衡量性能。有时,这意味着诊断内存泄漏。有时,这意味着获得对多线程或其他低级别活动的可见性。
那么,这些技术在概念上是否有所不同,或者仅仅是黑白两色?
基准测试可以衡量整个操作的时间。例如在某些工作负载下每秒的I / O操作。因此,结果通常是一个单一的数字,以秒或每秒的操作数表示。或具有不同参数结果的数据集,因此您可以对其进行图形化处理。
您可以使用基准比较相同硬件不同的软件,或与基准进行交互的其他软件的不同版本。例如,使用不同的apache设置测试每秒最大连接数。
概要分析并非旨在比较不同的事物:它是关于了解程序行为的。配置文件结果可能是时间的表每功能拍摄,或者甚至每指令具有采样分析器。您可以说这是一个配置文件而不是基准测试,因为说“该功能花费的时间最少,所以我们将保留该功能并停止使用其余功能”是没有意义的。
阅读维基百科文章以了解更多信息:https : //en.wikipedia.org/wiki/Profiling_(computer_programming)
您可以使用配置文件找出优化的地方。在程序中,将程序花费其时间的99%的速度提高10%比在其他任何功能中将速度提高100%更有价值。更好的是,您可以改进高级设计,从而减少昂贵的功能,并使其变得更快。
微基准测试是基准测试的一种特定形式。这意味着您正在测试一项超级特定的东西,以孤立地衡量它,而不是真正有用的东西的整体性能。
微基准测试结果示例:
此版本的memcpy实现了另一版本的80%的吞吐量。
mov eax, ecx
Haswell的延迟为0c,但mov ecx, ecx
延迟为1c。(移动消除仅在Intel的不同寄存器之间起作用)。请参阅该链接以获取静态可执行文件的完整asm源,并通过使用几个不同的循环体运行该性能计数器来展示性能计数器,以演示mov消除方法。
使用CPU性能计数器来衡量微基准测试的运行方式是进行实验以找出CPU内部工作方式的好方法。请参见Haswell / Skylake上的部分寄存器的性能如何?编写AL似乎对RAX有错误的依赖关系,而AH对于更多的示例是不一致的。在这种情况下,您需要对微基准进行概要分析,以了解使其以这种速度运行的原因。(通常,您对uops_exected之类的性能计数器比实际的时间或时钟周期计数更感兴趣,例如,测试微融合/分层,而无需进行实际影响每次迭代周期的循环。 )
非微基准测试结果示例:
另请参阅https://en.wikipedia.org/wiki/基准_(计算)#Types_of_benchmarks。
微基准测试是基准测试的一种特殊情况。如果操作正确,它将告诉您哪些操作成本高昂,哪些操作成本低廉,这在尝试优化时会有所帮助。如果做错了,那么您甚至可能根本没有测量过要测量的东西。例如,您编写了一些C来测试循环和while循环,但是由于不同的原因,编译器编写了不同的代码,因此结果毫无意义。(使用现代优化编译器,表达相同逻辑的不同方法几乎无关紧要;不要在此浪费时间。)微基准测试很难。
表示它是微基准的另一种方法是,您通常需要查看编译器的asm输出,以确保它正在测试要测试的内容。(例如,它没有通过重复执行10M次循环而在循环中提升一些昂贵的东西,而这种东西本应重复整个操作足够的时间以提供可以精确测量的持续时间,)
微基准测试可能会使事情失真,因为它们使用高速缓存高速缓存和分支预测变量预备测试您的功能,并且在被测代码调用之间不运行任何其他代码。当作为真实程序的一部分,它将导致更多的高速缓存未命中时,这可以使巨大的循环展开看起来不错。同样,它使大的查找表看起来不错,因为整个查找表最终都存储在缓存中。完整的程序通常在调用函数之间使足够的高速缓存变得脏污,以至于查找表并不总是会在高速缓存中命中,因此,仅计算某些东西就便宜了。(大多数程序受内存限制。重新计算不太复杂的程序通常与查找程序一样快。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句