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

golang?墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn)

 更新時(shí)間:2022年07月21日 16:08:59   作者:浪狼郎  
本文主要介紹了golang?墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

墻上時(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)制重置之后會跳到先前某個(gè)時(shí)間點(diǎn)。(這里不是很確定,猜測是如果時(shí)間差的不多,則調(diào)整石英晶體振蕩器的頻率,慢慢一致。如果差很多,則強(qiáng)行一致)

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

機(jī)器大多有自己的石英晶體振蕩器,并將其作為計(jì)時(shí)器。單調(diào)時(shí)鐘的絕對值沒有任何意義,根據(jù)操作系統(tǒng)和語言的不同,單調(diào)時(shí)鐘可能在程序開始時(shí)設(shè)為0、或在計(jì)算機(jī)啟動后設(shè)為0等等。但是通過比較同一臺計(jì)算機(jī)上兩次單調(diào)時(shí)鐘的差,可以獲得相對準(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
    ...
 }
復(fù)制代碼

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() - startNanostartNano的含義還是直接上代碼比較明了。

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

runtimeNano()是調(diào)用了匯編,獲取了操作系統(tǒng)當(dāng)前的單調(diào)時(shí)鐘。前面說過,單調(diào)時(shí)鐘的絕對值沒有什么意義。因此這里將兩個(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í)間間隔來檢測心跳。而墻上時(shí)鐘與NTP的組合可能會帶來時(shí)間的前后跳躍與閃爍,所以使用單調(diào)時(shí)鐘更加安全和保險(xiǎn)。

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

參考資料

go time分析

一個(gè)commit

go1.14.2 源碼

數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計(jì)(書)

到此這篇關(guān)于golang 墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang 墻上時(shí)鐘與單調(diào)時(shí)鐘內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中可比較的數(shù)據(jù)類型詳解

    Golang中可比較的數(shù)據(jù)類型詳解

    在日常開發(fā)中,比較操作是最常用的基本操作之一,可以用來判斷變量之間是否相等或者對應(yīng)的大小關(guān)系,本文將深入解析 Golang 中可比較的數(shù)據(jù)類型,并結(jié)合代碼示例來說明如何在不同情況下進(jìn)行比較,需要的朋友可以參考下
    2024-01-01
  • Go語言的反射機(jī)制詳解

    Go語言的反射機(jī)制詳解

    本文詳細(xì)講解了Go語言的反射機(jī)制,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • golang內(nèi)置函數(shù)len的小技巧

    golang內(nèi)置函數(shù)len的小技巧

    len是很常用的內(nèi)置函數(shù),可以測量字符串、slice、array、channel以及map的長度/元素個(gè)數(shù)。本文就來介紹一下其他小技巧,感興趣的可以了解一下
    2021-07-07
  • Golang?pprof監(jiān)控之cpu占用率統(tǒng)計(jì)原理詳解

    Golang?pprof監(jiān)控之cpu占用率統(tǒng)計(jì)原理詳解

    經(jīng)過前面的幾節(jié)對pprof的介紹,對pprof統(tǒng)計(jì)的原理算是掌握了七八十了,但唯獨(dú)還沒有分析pprof?工具是如何統(tǒng)計(jì)cpu使用情況的,今天我們來分析下這部分
    2023-04-04
  • gin項(xiàng)目部署到服務(wù)器并后臺啟動的步驟

    gin項(xiàng)目部署到服務(wù)器并后臺啟動的步驟

    本文主要介紹了gin項(xiàng)目部署到服務(wù)器并后臺啟動的步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 在Go中格式化字符串的幾種常用方法

    在Go中格式化字符串的幾種常用方法

    Go對字符串格式化提供了良好的支持,這篇文章主要給大家介紹了關(guān)于在Go中格式化字符串的幾種常用方法,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Go具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Go語言bufio庫的全面指南與實(shí)戰(zhàn)技巧詳解

    Go語言bufio庫的全面指南與實(shí)戰(zhàn)技巧詳解

    這篇文章主要為大家全面介紹一下?bufio?庫的核心組件與功能,包括?Reader、Writer?和?Scanner?等并深入探討它們在實(shí)際編程中的運(yùn)用場景和技巧,感興趣的可以了解下
    2024-01-01
  • Golang測試func?TestXX(t?*testing.T)的使用詳解

    Golang測試func?TestXX(t?*testing.T)的使用詳解

    一般Golang中的測試代碼都以xxx_test.go的樣式,在命名測試函數(shù)的時(shí)候以Testxx開頭,下面給大家介紹Golang測試func?TestXX(t?*testing.T)的使用,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Go語言面向?qū)ο笾械亩鄳B(tài)你學(xué)會了嗎

    Go語言面向?qū)ο笾械亩鄳B(tài)你學(xué)會了嗎

    面向?qū)ο笾械亩鄳B(tài)(Polymorphism)是指一個(gè)對象可以具有多種不同的形態(tài)或表現(xiàn)方式,本文將通過一些簡單的示例為大家講解一下多態(tài)的實(shí)現(xiàn),需要的可以參考下
    2023-07-07
  • 淺談Go1.18中的泛型編程

    淺談Go1.18中的泛型編程

    本文主要介紹了Go1.18中的泛型編程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論

庆安县| 北海市| 岢岚县| 独山县| 师宗县| 姚安县| 兴安盟| 株洲市| 沙雅县| 金乡县| 鄂尔多斯市| 武汉市| 嵩明县| 伽师县| 金坛市| 安远县| 横山县| 克拉玛依市| 东源县| 华容县| 温州市| 金塔县| 江都市| 开化县| 新蔡县| 余姚市| 沽源县| 澎湖县| 乌兰县| 新丰县| 稻城县| 新建县| 安多县| 伊川县| 和田县| 宜兴市| 武隆县| 文安县| 梁河县| 祁连县| 墨脱县|