中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang墻上時鐘與單調時鐘如何實現

發布時間:2022-07-22 09:48:38 來源:億速云 閱讀:154 作者:iii 欄目:開發技術

今天小編給大家分享一下golang墻上時鐘與單調時鐘如何實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    墻上時鐘與單調時鐘

    墻上時鐘

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

    墻上時間可以和NTP(Network Time Protocal,網絡時間協議)同步,但是如果本地時鐘遠遠快于NTP服務器,則強制重置之后會跳到先前某個時間點。(這里不是很確定,猜測是如果時間差的不多,則調整石英晶體振蕩器的頻率,慢慢一致。如果差很多,則強行一致)

    單調時鐘

    機器大多有自己的石英晶體振蕩器,并將其作為計時器。單調時鐘的絕對值沒有任何意義,根據操作系統和語言的不同,單調時鐘可能在程序開始時設為0、或在計算機啟動后設為0等等。但是通過比較同一臺計算機上兩次單調時鐘的差,可以獲得相對準確的時間間隔。

    Time的結構

     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共同記錄了時間,但是分為兩種情況,一種是沒有記錄單調時鐘(比如是通過字符串解析得到的時間),另一種是記錄了單調時鐘(比如通過Now)。

    wall的第一位是一個標記位

    如果為1,則表示記錄了單調時鐘。則wall的2-34(閉區間)位記錄了從1885-1-1到現在的秒數,最后30位記錄了納秒數。而ext記錄了從程序開始運行到現在經過的單調時鐘數。

    如果為0,則表示沒有記錄單調時鐘。則wall的2-34(閉區間)位全部為0(那最后30位是啥?)。而ext記錄了從1-1-1到現在經過的秒數。

    Since的實現

    golang墻上時鐘與單調時鐘如何實現

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

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

    runtimeNano()是調用了匯編,獲取了操作系統當前的單調時鐘。前面說過,單調時鐘的絕對值沒有什么意義。因此這里將兩個時間相減,得到了從程序開始到現在的單調時鐘。

    然后看一下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
        }
     }

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

    以上就是“golang墻上時鐘與單調時鐘如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    双峰县| 临沭县| 连城县| 颍上县| 扬州市| 东光县| 芒康县| 丰县| 安宁市| 新巴尔虎右旗| 尼木县| 通州市| 临桂县| 曲阳县| 准格尔旗| 安阳县| 五台县| 和龙市| 略阳县| 凤山市| 满洲里市| 富锦市| 图片| 神木县| 黔江区| 龙山县| 营口市| 南华县| 瑞昌市| 孝义市| 惠州市| 突泉县| 儋州市| 固阳县| 佛冈县| 乌拉特后旗| 克拉玛依市| 新田县| 永和县| 丽水市| 偃师市|