1. 外部实现
2. golang源码改造(基于1.14)
- 通过分析time和runtime/time.go 得知,目前最核心获取时间的是两个函数,分别是runtime.now()和runtime.nanotime。其中time.now的实现直接在runtime库的汇编里,通过runtime·time符号来连接,nanotime是在runtime/time_nofake.go对汇编实现的nanotime1()进行了简单封装。
nanotime:获取的是系统单调增长的时间,不随操作系统时间设置变化而减少。在golang大面积应用于协程调度,timer相关的实现里(参考runtine/proc.go:checkTimers)。也正是因为这个,只改now会有诡异的现象发生,
nanotime的实现:
runtime/time_nofake.go
//go:nosplit
func nanotime() int64 {
return nanotime1()
}
now: 获取操作系统的时间,可被回溯到旧时间
now的实现:
以runtime/sys_windows_amd64.s为例:
TEXT time·now(SB),NOSPLIT,$0-24
CMPB