Jim*_*ams 16 benchmarking profiling
我看到术语软件基准测试和分析有时可以互换,但据我的理解,这是一个微妙的差异.
两者都是按时间连接的.但是,虽然基准测试主要是确定可以与其他应用程序进行比较的特定速度分数,但分析可以为您提供有关应用程序在大部分时间(或周期数)上花费的确切信息.
对我来说,它总是如下:集成测试是基准测试和单元测试对应的分析测试的对应物.但微基准测试如何适用于此?
有人在这里说:
分析和基准测试是相同硬币的另一面,分析可帮助您缩小到最有用的优化位置,基准测试可让您轻松隔离优化并对它们进行交叉比较.
另一个人在这里谈到分析:
分析在不同时间意味着不同的东西.有时它意味着衡量绩效.有时它意味着诊断内存泄漏.有时它意味着可以了解多线程或其他低级别活动.
那么,这些技术在概念上是不同的还是不是那种黑白?
Pet*_*des 21
基准测量可以衡量整个操作的时间.例如,在某些工作负载下每秒的I/O操作.因此,结果通常是单个数字,以秒或每秒操作数.或者包含不同参数结果的数据集,因此您可以对其进行绘图.
您可以使用基准测试来比较不同硬件上的相同软件,或基准测试与之交互的其他软件的不同版本.例如,每秒使用不同的apache设置进行基准最大连接.
分析不是为了比较不同的东西:它是关于理解程序的行为. 配置文件结果可能是每个功能所用的时间表,甚至是带有采样分析器的每条指令.你可以说它不是一个基准测试,因为说"这个功能占用的时间最少,所以我们保留一个并停止使用其余部分"是没有意义的.
阅读维基百科文章以了解更多信息:https://en.wikipedia.org/wiki/Profiling_ (computer_programming)
您可以使用配置文件找出要优化的位置.在你的程序花费99%的时间的函数中,10%的加速比在任何其他函数中的100%加速更有价值.更好的是当你可以改进你的高级设计时,所以昂贵的功能被称为更少,并且只是让它更快.
微标记是一种特定的基准测试形式.这意味着你正在测试一个超级特定的东西来单独测量它,而不是真正有用的任何东西的整体性能.
示例微基准测试结果:
mov eax, ecxHaswell有0c延迟,但mov ecx, ecx有1c延迟.(mov-elimination仅适用于Intel上的不同寄存器).请参阅该链接以获取静态可执行文件的完整asm源,并通过运行几个不同的循环体来演示性能计数器以演示mov-elimination.
使用CPU性能计数器来测量微基准测试的运行方式是进行实验以了解CPU如何在内部工作的好方法.请参阅Haswell/Skylake上的部分寄存器究竟如何执行?编写AL似乎对RAX具有错误依赖性,并且AH对于更多示例而言是不一致的.在这种情况下,您正在分析您的微基准测试,以了解是什么让它以这种速度运行.(通常你对uops_executed等性能计数器比对实际时间或时钟周期计数更感兴趣,例如测试微融合/非层压而不需要进行实际影响每次迭代循环的循环. )
示例非微基准测试结果:
另请参见https://en.wikipedia.org/wiki/Benchmark_(computing)#Types_of_benchmarks.
微基准测试是基准测试的一个特例.如果你做得对,它会告诉你哪些操作很昂贵,哪些操作很便宜,这有助于你在尝试优化时.如果你做错了,你甚至可能根本没有测量你想要测量的东西.例如,你写了一些C来测试循环与while循环,但编译器因不同的原因制作了不同的代码,你的结果毫无意义.(表达相同逻辑的不同方式对于现代优化编译器几乎无关紧要;不要在此基础上浪费时间.)微基准测试很难.
告诉它是微基准测试的另一种方法是你通常需要查看编译器的asm输出,以确保它测试你想要测试的内容.(例如,它没有被提升的东西贵出那是应该重复整个操作足够的时间以得到可以准确地测量时间循环的在您的重复-10M-次循环迭代优化.)
微基准测试可能会扭曲事物,因为它们通过热缓存和分支预测器来测试您的函数,并且它们不会在被测代码的调用之间运行任何其他代码.这可以使巨大的循环展开看起来很好,当作为真实程序的一部分时,它会导致更多的缓存未命中.类似地,它使大的查找表看起来很好,因为整个查找表最终在缓存中.完整的程序通常会在对查找表并不总是在缓存中命中的函数的调用之间弄脏足够的缓存,因此计算某些东西会更便宜.(大多数程序都受内存限制.重新计算不太复杂的东西通常和查找它一样快.)
| 归档时间: |
|
| 查看次数: |
3885 次 |
| 最近记录: |