亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號