unsigned long long _get_cpu_counts_() {
__asm__("rdtsc;\nshl $32, %rdx;\norq %rdx, %rax");
}
等价于(Intel汇编):
rdtsc
;//等价于db 0F,31(见下图)
;//一般像vc++不能识别rdtsc(现在有没有修复没有做测试,这里也不展开研究)
;//使用 _asm _emit 0x0F 以及 _asm _emit 0x31
shl rdx, 32
or rax, rdx
由intel关于RDTSC的解释:
指令只会将时间戳的数值的低位储存在eax,而高位储存在edx。即使64位也不会让其完整存在rax中(除非经过编译器自己优化等操作过一番)。那么用寄存器移位逻辑或的指令将时间戳完整地作为rax返回(注:函数返回值不受__fastcall之类的影响或者编译器自己化简只会经过ax,eax或者rax返回)
一般这个获取cpu时间戳的函数不建议新开变量,那样会对栈操作多出好几个平衡栈的指令,直接寄存器操作事实上应该更快,事实上用-S 编译出来新开变量的汇编指令就确实要比这样不开变量直接移位+逻辑或多出很多行,但我没有详细测试过真正的时间对比。而且已经没有可以与cpu时间戳相比的时间比较对象了(它就是cpu能够获取的最精确的面向cpu运行时间的计数器),只能通过多次获取而取平均值。具体不做测试了。如果就从代码量上来看,这样已经可以达到足够快速地获取完整的cpu时间戳了。