假设我用编译语言(例如C)编写自己的StringBuilder. 衡量各种实施性能的最佳方法是什么?简单地计时几十万次运行会产生高度不一致的结果:从一批到另一批的时间差异可能高达15%,因此
衡量各种实施性能的最佳方法是什么?简单地计时几十万次运行会产生高度不一致的结果:从一批到另一批的时间差异可能高达15%,因此无法准确评估潜在的性能改进,从而使性能提升小于此.
我做了以下事情:
>禁用SpeedStep
>使用RDTSC进行计时
>以实时优先级运行流程
>将亲和力设置为单个CPU核心
这有点稳定了结果.还有其他想法吗?
精确测量一段代码真的很难.对于这些要求,我建议您查看 Agner Fog’s test suite.通过使用它,您可以测量时钟周期并收集一些重要因素(例如缓存未命中,分支错误预测等).另外,我建议你从Agner的网站上看一下PDF document.这是一个非常宝贵的文档,可以实现这样的微优化.
另外,实际性能不是“时钟周期”的函数.缓存未命中可以改变实际应用程序中每次运行的所有内容.所以,我会首先优化缓存未命中.只需为相同的内存部分多次运行一段代码,就可以大大减少缓存未命中.因此,它很难精确测量.整个应用程序调整通常是更好的想法IMO.英特尔VTune和其他工具非常适合这种用法.