最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔問題

 更新時(shí)間:2022年06月02日 10:26:46   作者:幽鬼  
這篇文章主要介紹了Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔,在go語(yǔ)言中,沒有直接調(diào)用時(shí)鐘的函數(shù),可以通過?time.Now()?獲得帶單調(diào)時(shí)鐘的?Time?結(jié)構(gòu)體,并通過Since和Until獲得相對(duì)準(zhǔn)確的時(shí)間間隔,需要的朋友可以參考下

墻上時(shí)鐘與單調(diào)時(shí)鐘

墻上時(shí)鐘

墻上時(shí)鐘也稱為墻上時(shí)間。大多是1970年1月1日(UTC)以來的秒數(shù)和毫秒數(shù)。

墻上時(shí)間可以和NTP(Network Time Protocal,網(wǎng)絡(luò)時(shí)間協(xié)議)同步,但是如果本地時(shí)鐘遠(yuǎn)遠(yuǎn)快于NTP服務(wù)器,則強(qiáng)制重置之后會(huì)跳到先前某個(gè)時(shí)間點(diǎn)。(這里不是很確定,猜測(cè)是如果時(shí)間差的不多,則調(diào)整石英晶體振蕩器的頻率,慢慢一致。如果差很多,則強(qiáng)行一致)

單調(diào)時(shí)鐘

機(jī)器大多有自己的石英晶體振蕩器,并將其作為計(jì)時(shí)器。單調(diào)時(shí)鐘的絕對(duì)值沒有任何意義,根據(jù)操作系統(tǒng)和語(yǔ)言的不同,單調(diào)時(shí)鐘可能在程序開始時(shí)設(shè)為0、或在計(jì)算機(jī)啟動(dòng)后設(shè)為0等等。但是通過比較同一臺(tái)計(jì)算機(jī)上兩次單調(diào)時(shí)鐘的差,可以獲得相對(duì)準(zhǔn)確的時(shí)間間隔。

Time的結(jié)構(gòu)

type Time struct {
    // wall and ext encode the wall time seconds, wall time nanoseconds,
    // and optional monotonic clock reading in nanoseconds.
    //
    // From high to low bit position, wall encodes a 1-bit flag (hasMonotonic),
    // a 33-bit seconds field, and a 30-bit wall time nanoseconds field.
    // The nanoseconds field is in the range [0, 999999999].
    // If the hasMonotonic bit is 0, then the 33-bit field must be zero
    // and the full signed 64-bit wall seconds since Jan 1 year 1 is stored in ext.
    // If the hasMonotonic bit is 1, then the 33-bit field holds a 33-bit
    // unsigned wall seconds since Jan 1 year 1885, and ext holds a
    // signed 64-bit monotonic clock reading, nanoseconds since process start.
    wall uint64
    ext  int64
    ...
 }

wall和ext共同記錄了時(shí)間,但是分為兩種情況,一種是沒有記錄單調(diào)時(shí)鐘(比如是通過字符串解析得到的時(shí)間),另一種是記錄了單調(diào)時(shí)鐘(比如通過Now)。

wall的第一位是一個(gè)標(biāo)記位

如果為1,則表示記錄了單調(diào)時(shí)鐘。則wall的2-34(閉區(qū)間)位記錄了從1885-1-1到現(xiàn)在的秒數(shù),最后30位記錄了納秒數(shù)。而ext記錄了從程序開始運(yùn)行到現(xiàn)在經(jīng)過的單調(diào)時(shí)鐘數(shù)。

如果為0,則表示沒有記錄單調(diào)時(shí)鐘。則wall的2-34(閉區(qū)間)位全部為0(那最后30位是啥?)。而ext記錄了從1-1-1到現(xiàn)在經(jīng)過的秒數(shù)。

Since的實(shí)現(xiàn)

這里比較關(guān)鍵的代碼是第914行的 runtimeNano() - startNano 。 startNano 的含義還是直接上代碼比較明了。

var startNano = 0
 func init(){
     startNano = runtimeNano()
 }

runtimeNano() 是調(diào)用了匯編,獲取了操作系統(tǒng)當(dāng)前的單調(diào)時(shí)鐘。前面說過,單調(diào)時(shí)鐘的絕對(duì)值沒有什么意義。因此這里將兩個(gè)時(shí)間相減,得到了從程序開始到現(xiàn)在的單調(diào)時(shí)鐘。

然后看一下Sub

func (t Time) Sub(u Time) Duration {
    if t.wall&u.wall&hasMonotonic != 0 {
       te := t.ext
       ue := u.ext
       d := Duration(te - ue)
       if d < 0 && te > ue {
          return maxDuration // t - u is positive out of range
       }
       if d > 0 && te < ue {
          return minDuration // t - u is negative out of range
       }
       return d
    }
    d := Duration(t.sec()-u.sec())*Second + Duration(t.nsec()-u.nsec())
    // Check for overflow or underflow.
    switch {
    case u.Add(d).Equal(t):
       return d // d is correct
    case t.Before(u):
       return minDuration // t - u is negative out of range
    default:
       return maxDuration // t - u is positive out of range
    }
 }

這里我們只需要關(guān)注2-13行即可。除去了范圍檢查,這里的主要邏輯就是兩個(gè)Time的ext相減。而ext又都代表了單調(diào)時(shí)鐘,所以最后返回的是單調(diào)時(shí)鐘的差值。

小結(jié)

在分布式系統(tǒng)中,我們經(jīng)常需要判斷時(shí)間間隔來檢測(cè)心跳。而墻上時(shí)鐘與NTP的組合可能會(huì)帶來時(shí)間的前后跳躍與閃爍,所以使用單調(diào)時(shí)鐘更加安全和保險(xiǎn)。

在go語(yǔ)言中,沒有直接調(diào)用調(diào)用時(shí)鐘的函數(shù)??梢酝ㄟ^ time.Now() 獲得帶單調(diào)時(shí)鐘的 Time 結(jié)構(gòu)體,并通過Since和Until獲得相對(duì)準(zhǔn)確的時(shí)間間隔。

參考資料

到此這篇關(guān)于Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔的文章就介紹到這了,更多相關(guān)go時(shí)間間隔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 快速解決Golang Map 并發(fā)讀寫安全的問題

    快速解決Golang Map 并發(fā)讀寫安全的問題

    這篇文章主要介紹了快速解決Golang Map 并發(fā)讀寫安全的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 細(xì)說Go語(yǔ)言中空結(jié)構(gòu)體的奇妙用途

    細(xì)說Go語(yǔ)言中空結(jié)構(gòu)體的奇妙用途

    Go語(yǔ)言中,我們可以定義空結(jié)構(gòu)體,即沒有任何成員變量的結(jié)構(gòu)體,使用關(guān)鍵字?struct{}?來表示。這種結(jié)構(gòu)體似乎沒有任何用處,但實(shí)際上它在?Go?語(yǔ)言中的應(yīng)用非常廣泛,本文就來詳解講講
    2023-05-05
  • Go語(yǔ)言實(shí)現(xiàn)Viper配置管理筆記

    Go語(yǔ)言實(shí)現(xiàn)Viper配置管理筆記

    Viper 是一個(gè)功能強(qiáng)大、靈活易用的配置管理工具,本文主要介紹了Go語(yǔ)言實(shí)現(xiàn)Viper配置管理筆記,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • 詳解Golang中interface接口的原理和使用技巧

    詳解Golang中interface接口的原理和使用技巧

    interface?接口在?Go?語(yǔ)言里面的地位非常重要,是一個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu)。本文主要介紹了Golang中interface接口的原理和使用技巧,希望對(duì)大家有所幫助
    2022-11-11
  • 淺析Go匯編語(yǔ)法和MatrixOne使用介紹

    淺析Go匯編語(yǔ)法和MatrixOne使用介紹

    MatrixOne由Go語(yǔ)言所開發(fā)是一個(gè)新一代超融合異構(gòu)數(shù)據(jù)庫(kù),致力于打造單一架構(gòu)處理TP、AP、流計(jì)算等多種負(fù)載的極簡(jiǎn)大數(shù)據(jù)引擎,今天通過本文給大家介紹Go匯編語(yǔ)法和MatrixOne使用,感興趣的朋友一起看看吧
    2022-04-04
  • Go爬蟲(http、goquery和colly)詳解

    Go爬蟲(http、goquery和colly)詳解

    goquery可以避免操作復(fù)雜的正則表達(dá)式,它可以直接根據(jù)url獲取一個(gè)Document對(duì)象,然后根據(jù)標(biāo)簽選擇器、類選擇器和id選擇器獲取相應(yīng)的選擇對(duì)象,進(jìn)行自定義的操作,這篇文章主要介紹了Go爬蟲(http、goquery和colly),需要的朋友可以參考下
    2022-09-09
  • vscode中安裝Go插件和配置Go環(huán)境詳細(xì)步驟

    vscode中安裝Go插件和配置Go環(huán)境詳細(xì)步驟

    要在VSCode中配置Go語(yǔ)言插件,首先需要確保你的電腦已經(jīng)安裝了Go環(huán)境和最新版本的VSCode,這篇文章主要給大家介紹了關(guān)于vscode中安裝Go插件和配置Go環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • golang爬蟲colly?發(fā)送post請(qǐng)求

    golang爬蟲colly?發(fā)送post請(qǐng)求

    本文主要介紹了golang爬蟲colly?發(fā)送post請(qǐng)求實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • GoLang中Json?Tag用法實(shí)例總結(jié)

    GoLang中Json?Tag用法實(shí)例總結(jié)

    這篇文章主要給大家介紹了關(guān)于GoLang中Json?Tag用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Golang實(shí)現(xiàn)復(fù)合數(shù)據(jù)類型

    Golang實(shí)現(xiàn)復(fù)合數(shù)據(jù)類型

    Go語(yǔ)言的復(fù)合數(shù)據(jù)類型包括數(shù)組、切片、映射、結(jié)構(gòu)體和接口,本文就來介紹一下Golang實(shí)現(xiàn)復(fù)合數(shù)據(jù)類型,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02

最新評(píng)論

巴林右旗| 清流县| 阿勒泰市| 维西| 汾西县| 新干县| 封丘县| 平凉市| 台湾省| 遵化市| 赤峰市| 晋城| 扬州市| 绥棱县| 靖宇县| 胶州市| 南陵县| 沁阳市| 明水县| 高邑县| 德钦县| 大关县| 南康市| 商丘市| 阿巴嘎旗| 武乡县| 文山县| 夏津县| 宿州市| 威宁| 新巴尔虎左旗| 土默特左旗| 彩票| 惠水县| 临江市| 防城港市| 通河县| 墨玉县| 鸡西市| 潼关县| 临猗县|