Go怎么获取当前时间? Go ARM64 vDSO优化之路
https://mzh.io/
Go ARM64 vDSO优化之路
背景
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)来提供一些常见的内核函数 这样就不用切换用户态了。