为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
幕布斯7119047 2023-07-10 14:23:57
我曾经time.Now().UnixNano()计算代码某些部分的执行时间,但我发现了一件有趣的事情。有时 IO 操作后经过的时间为零!它出什么问题了?代码在Go 1.11中运行,并使用标准库"time"。Redis 库是"github.com/mediocregopher/radix.v2/redis". redis服务器版本是3.2。我在 Windows 上使用 VSCode 编辑器运行它。isGatherTimeStat = falseif 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
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

你的代码没有任何问题。在 Windows 上,系统时间通常每隔 10-15 毫秒左右更新一次,这意味着如果您在此期间查询当前时间两次,您将得到相同的值。

您的操作有时会产生t = 2997600ns = 3ms,这可以解释这一点。归咎于Windows。

查看完整回答
反对 回复 2023-07-10
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

time.Now()Go 1.16 中改进了 Windows 下的分辨率,

计时器分辨率现在应约为 500 纳秒。

测试程序:

package main


import (

    "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


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信