猿问

为什么 time.Now().UnixNano() 在 IO 操作后返回相同的结果?

我曾经time.Now().UnixNano()计算代码某些部分的执行时间,但我发现了一件有趣的事情。有时 IO 操作后经过的时间为零!它出什么问题了?


代码在Go 1.11中运行,并使用标准库"time"。Redis 库是"github.com/mediocregopher/radix.v2/redis". redis服务器版本是3.2。我在 Windows 上使用 VSCode 编辑器运行它。


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


幕布斯7119047
浏览 133回答 2
2回答

慕运维8079593

你的代码没有任何问题。在 Windows 上,系统时间通常每隔 10-15 毫秒左右更新一次,这意味着如果您在此期间查询当前时间两次,您将得到相同的值。您的操作有时会产生t = 2997600ns = 3ms,这可以解释这一点。归咎于Windows。

繁华开满天机

time.Now()Go 1.16 中改进了 Windows 下的分辨率,计时器分辨率现在应约为 500 纳秒。测试程序:package mainimport (    "fmt"    "time")func timediff() int64 {    t0 := time.Now().UnixNano()    for {        t := time.Now().UnixNano()        if t != t0 {            return t - t0        }    }}func main() {    var ds []int64    for i := 0; i < 10; i++ {        ds = append(ds, timediff())    }    fmt.Printf("%v nanoseconds\n", ds)}测试输出:[527400 39200 8400 528900 17000 16900 8300 506300 9700 34100] nanoseconds
随时随地看视频慕课网APP

相关分类

Go
我要回答