Go怎么获取当前时间? Go ARM64 vDSO优化之路

https://mzh.io/

 

Go ARM64 vDSO优化之路

2018-03-16  | Meng Zhuo

背景

Go怎么获取当前时间?问一个会Go的程序员,他随手就能写这个出来给你。

import time

time.Now()

这背后是一个系统调用,X86上调用SYSCALL来完成,ARM64上是SVC。

// func walltime() (sec int64, nsec int32)  
TEXT runtime·walltime(SB),NOSPLIT,$24-12    
        MOVW    $0, R0 // CLOCK_REALTIME    
        MOVD    RSP, R1                     
        MOVD    $SYS_clock_gettime, R8      
        SVC                                 
        MOVD    0(RSP), R3      // sec      
        MOVD    8(RSP), R5      // nsec     
        MOVD    R3, sec+0(FP)               
        MOVW    R5, nsec+8(FP)              
        RET
  • R0 分别是调用的时钟类型
  • R1 是对应的Stack Pointer
  • R8 系统调用的ID

很简单吧?但是这里有一个优化点,就是SVC涉及到了内核态和用户态的切换, 其实就是把所有的用户态的寄存器存储在内核的栈上,执行完内核函数之后,再恢复回来。 这一来一回,速度就降下来了……

而时间又是很常见的系统调用,且是只读数据,能不能不切换内核/用户态呢? Linux内核的开发者们提出了vDSO方案。 通过给每个用户态进程添加一个共享对象(virtual dynamic shared object)来提供一些常见的内核函数 这样就不用切换用户态了。

 

 

 

posted @ 2018-08-16 14:05  papering  阅读(656)  评论(0编辑  收藏  举报