【发布时间】:2019-12-08 15:36:37
【问题描述】:
我使用time.Now().UnixNano() 来计算我的部分代码的执行时间,但我发现了一件有趣的事情。 IO 操作后经过的时间有时为零!它有什么问题?
代码在 Go 1.11 中运行,并使用标准库 "time"。 Redis 库是"github.com/mediocregopher/radix.v2/redis"。 redis服务器版本为3.2。我正在使用 VSCode 编辑器在 Windows 上运行它。
isGatherTimeStat = false
if rand.Intn(100) < globalConfig.TimeStatProbability { // Here I set TimeStatProbability 100
isGatherTimeStat = true
}
if isGatherTimeStat {
timestampNano = time.Now()
}
globalLogger.Info("time %d", time.Now().UnixNano())
resp := t.redisConn.Cmd("llen", "log_system")
globalLogger.Info("time %d", time.Now().UnixNano())
if isGatherTimeStat {
currentTimeStat.time = time.Since(timestampNano).Nanoseconds()
currentTimeStat.name = "redis_llen"
globalLogger.Info("redis_llen time sub == %d", currentTimeStat.time)
select {
case t.chTimeStat <- currentTimeStat:
default:
}
}
这里有一些日志:
[INFO ][2019-07-31][14:47:53] time 1564555673269444200
[INFO ][2019-07-31][14:47:53] time 1564555673269444200
[INFO ][2019-07-31][14:47:53] redis_llen time sub == 0
[INFO ][2019-07-31][14:47:58] time 1564555678267691700
[INFO ][2019-07-31][14:47:58] time 1564555678270689300
[INFO ][2019-07-31][14:47:58] redis_llen time sub == 2997600
[INFO ][2019-07-31][14:48:03] time 1564555683268195600
[INFO ][2019-07-31][14:48:03] time 1564555683268195600
[INFO ][2019-07-31][14:48:03] redis_llen time sub == 0
[INFO ][2019-07-31][14:48:08] time 1564555688267631100
[INFO ][2019-07-31][14:48:08] time 1564555688267631100
[INFO ][2019-07-31][14:48:08] redis_llen time sub == 0
【问题讨论】:
-
您在哪个硬件架构上运行?
-
你是在 Windows 上运行这个吗?
-
@icza 是的,它在 Windows 上运行。
-
@icza 实际上在 VSCode 编辑器中。
-
您的代码没有问题。在 Windows 上,时间分辨率通常高于 1 毫秒。这意味着如果您在一毫秒内两次查询实际时间,您通常会得到相同的值。您的操作有时会产生
t = 2997600ns = 0.3μs,这可以解释这一点。归咎于 Windows。