Sil*_*ids 5 c++ linux performance benchmarking
我正在寻找一些非常基本的小代码路径微基准测试,例如我用C++编写的紧密循环.我在Linux和OSX上运行,并使用GCC.亚毫秒准确度有哪些设施?我想一个简单的测试运行代码路径很多次(数千万?)将给我足够的一致性,以获得良好的阅读.如果有人知道更好的方法,请随时提出建议.
您可以"rdtsc"在x86/x86_64上使用处理器指令.对于多核系统,检查CPUID中的"constant_tsc"功能(linux中的/ proc/cpuinfo) - 这意味着所有内核都使用相同的tick计数器,即使动态频率更改和休眠也是如此.
如果您的处理器不支持constant_tsc,请确保将程序绑定到核心(tasksetLinux中的实用程序).
当在无序CPU上使用rdtsc时(除了Intel Atom之外,可能是其他一些低端的cpus),之前添加一个"排序"指令,例如"cpuid" - 它将临时禁用指令重新排序.
此外,MacOsX有"Shark",可以测量代码中的一些硬件事件.
RDTSC和无序的CPU.有关优化的第2版Fog手册第18节中的更多信息:使用汇编语言优化子程序:x86平台的优化指南(包含所有五本手册的主站点是http://www.agner.org/optimize/)
http://www.scribd.com/doc/1548519/optimizing-assembly
在所有具有无序执行的处理器上,您必须在每次读取计数器之前和之后插入XOR EAX,EAX/CPUID,以防止它与其他任何内容并行执行.CPUID是一个序列化指令,这意味着它会刷新管道并等待所有挂起的操作完成后再继续.这对于测试目的非常有用.