GCC下通过汇编获取cpu时间戳(注记)

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的解释:
Intel IA-32 RDTSC
指令只会将时间戳的数值的低位储存在eax,而高位储存在edx。即使64位也不会让其完整存在rax中(除非经过编译器自己优化等操作过一番)。那么用寄存器移位逻辑或的指令将时间戳完整地作为rax返回(注:函数返回值不受__fastcall之类的影响或者编译器自己化简只会经过ax,eax或者rax返回)

一般这个获取cpu时间戳的函数不建议新开变量,那样会对栈操作多出好几个平衡栈的指令,直接寄存器操作事实上应该更快,事实上用-S 编译出来新开变量的汇编指令就确实要比这样不开变量直接移位+逻辑或多出很多行,但我没有详细测试过真正的时间对比。而且已经没有可以与cpu时间戳相比的时间比较对象了(它就是cpu能够获取的最精确的面向cpu运行时间的计数器),只能通过多次获取而取平均值。具体不做测试了。如果就从代码量上来看,这样已经可以达到足够快速地获取完整的cpu时间戳了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值