Go 的時間包:理解單調時間與掛鐘時間

Go 的時間包:理解單調時間與掛鐘時間 📅

引言

Go 語言自版本 1.9 起在 time.Time 中同時支持 “掛鐘時間(wall?clock)” 和 “單調時間(monotonic clock)”,用于分別滿足時間戳與時間間隔測量的需求。本文將幫你快速掌握二者區別與使用中的常見坑。


一、掛鐘 vs 單調時間:何時何用?

  • 掛鐘時間(wall?clock):現實世界的時間,如 UTC 或本地時區,用于生成具有全局意義的時間戳,但可能因 NTP 校準、夏令時切換、閏秒插入等原因跳變 X (formerly Twitter)+2VictoriaMetrics+2X (formerly Twitter)+2。

  • 單調時間(monotonic):穩步前進、永不后退,專用于測量時間間隔,不受系統時間調整影響 VictoriaMetrics。

在 Go 中,這兩者各司其職:掛鐘用于“告訴我現在幾點”,單調時間用于“測量經過了多久”。


二、Go 中的實現方式

  • time.Now() 返回的 time.Time 結構內同時包含壁鐘與單調時間組件(后者存儲在 ext 字段的隱藏部分) VictoriaMetrics。

  • 只有通過 runtime 調用的 time.Now() 和相關函數才帶有單調時間。其他構造方式如 time.Date, time.Parse, time.Unix 不包含單調時間,只保留掛鐘部分 VictoriaMetrics。

運行時輸出的 m=+0.xxx 后綴即表示自程序啟動以來的單調時間偏移,例如:

 

yaml

複製編輯

2025?07?25 … m=+0.000123456

說明這段時間使用的是單調時間測量 VictoriaMetrics。


三、常見誤區與正確比較方式

? 比較 time.Time==
  • 直接用 == 比較可能錯誤,因為 UTC()Truncate() 會清除或重設內部單調時間或位置指針,導致相等時間比較結果為 false VictoriaMetrics。

應使用:

go

複製編輯

t1.Equal(t2)

它會根據是否同時擁有單調時間來判斷:若都有,則比較 ext;否則比較掛鐘時間(秒與納秒) X (formerly Twitter)+2VictoriaMetrics+2X (formerly Twitter)+2。


四、測量時間間隔的正確方式

  • 推薦使用帶單調時間的 time.Since(t) 或者 time.Now().Sub(t),如果 t 擁有單調時間讀取,則將使用單調方式計算間隔,避免掛鐘跳變造成計算錯誤 VictoriaMetrics。

  • t 是通過 time.Parse 等構造的無單調信息,則會退回到掛鐘計算,可能受到系統校時影響。

  • 性能優化技巧:在高頻路徑下,可以使用:

     

    go

    複製編輯

    past := time.Now() // ... nowApprox := past.Add(time.Since(past))

    可提升 ~50% 性能,但不再捕捉系統時間調整。如果你不需要對校時敏感,可適用此技巧 VictoriaMetrics。


五、計劃調度中的壁鐘風險

  • 對于基于“現在是幾點?”或“下一次調度是什么時間?”的應用(如 cron 作業、日志輪轉、告警檢查等),應使用掛鐘時間進行比較,即使掛鐘可能跳變。

  • monotinic 時鐘在系統掛起(sleep)后通常會暫停,這可能導致間隔計算不含掛起時間,所以調度應當依賴壁鐘路徑 VictoriaMetrics。


六、底層結構揭秘

  • Go 1.9 之前,time.Time 的結構體只有 sec, nsec, loc,不支持單調時間。 Go 1.9 開始引入 wall uint64, ext int64, loc *Location 三字段形式,在 24 字節內兼容保存掛鐘與單調時間信息 VictoriaMetrics。

  • 當只存掛鐘時,ext 用作 wall 秒字段;有單調時間時,wall 秒搬移進 wallext 變為 monotonic 時間讀取。

  • 如果時間運算(如 Add())導致 monotonic 范圍超出,Go 會自動剝離 monotonic 信息,只保留壁鐘時間 VictoriaMetrics。


總結建議

用途推薦方式
獲取當前時間戳time.Now()(包含掛鐘)
測量時間間隔time.Since(t)time.Now().Sub(t)(使用單調時間)
高頻日期時間計算(無需 sync 調整)past.Add(time.Since(past))
基于日歷時間的調度任務使用掛鐘比較(保留跳變行為)


結語

理解 Go 的掛鐘與單調時間機制,對于寫出健壯且高性能的時間處理邏輯至關重要。特別是在涉及延遲測量、調度任務或系統校時情況時,這項知識能避免許多 subtle bug。

原文作者 Phuong?Le 于 2025 年 7 月 25 日發布的這篇文章深入技術細節,對 Go 時間包底層實現給出了清晰講解,非常值得一讀 VictoriaMetrics+4VictoriaMetrics+4VictoriaMetrics+4。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90893.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android啟動時間優化大全

1 修改Android mksh默認的列長度 不修改這個參數,adb shell后,輸入超過80個字符,就不能看到完整的命令行。external/mksh/src/sh.h EXTERN mksh_ari_t x_cols E_INIT(80); EXTERN mksh_ari_t x_lins E_INIT(24);2 Kernel優化 2.1 內核驅動模塊…

matplotlib.pyplot: 底層原理簡析與進階技巧

文章目錄 1 底層實現原理 1.1 核心架構 1.1 渲染流程 2 基礎用法 2.1 基本繪圖 2.2 多子圖系統 2.3 高階用法 2.3.1 自定義Artist對象 2.3.2 高級動畫技術 2.3.3 事件處理系統 2.3.4 混合渲染技術 3 性能優化技巧 4 擴展模塊 5 總結 5.1 底層原理關鍵點 5.2 進階技巧 1 底層實現…

深入理解現代前端開發中的 <script type=“module“> 與構建工具實踐

引言:模塊化開發的演進在早期的前端開發中,JavaScript 缺乏原生的模塊化支持,開發者不得不依賴 IIFE(立即調用函數表達式)或第三方庫(如 RequireJS)來實現代碼組織。隨著 ES6(ES2015…

yolo--qt可視化開發

qt5可能不支持我們的cuda版本,改用qt6 YOLO11QT6OpencvC訓練加載模型全過程講解_yolov11 模型轉換成opencv c模型-CSDN博客 下面是qt5版本的案例,和yolo及cuda有沖突 安裝qt 切換到虛擬環境,例如pyqt,conda activate pyqt pip …

SQL性能優化

show [session|global] status : 查看服務器狀態 show global status like Com_ : 查看各種語句的執行次數 開啟慢查詢: 在 MySQL 配置文件(/etc/my.cnf)配置: #開啟MySQL慢日志查詢開關 slow_query_log1 #設置慢日志的時間為2秒,SQL語句執…

ctfshow pwn40

目錄 1. 分析程序 2. 漏洞編寫 3. 漏洞驗證 1. 分析程序 首先檢查程序相關保護,發現程序為32位且只開啟了一個NX保護 checksec pwn 使用IDA進行逆向分析代碼,查看漏洞觸發點: 在main函數中,有一個ctfshow函數,這里…

SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL173 店鋪901國慶期間的7日動銷率和滯銷率 SQL題解:店鋪動銷率與滯銷率計算 關鍵:只要當天任一店鋪有任何商品的銷量就輸出該天的結果,即使店鋪901當天的動銷率為0。 潛臺詞:?輸出邏輯與店鋪901的銷售情況無關,只取…

PytorchLightning最佳實踐基礎篇

PyTorch Lightning(簡稱 PL)是一個建立在 PyTorch 之上的高層框架,核心目標是剝離工程代碼與研究邏輯,讓研究者專注于模型設計和實驗思路,而非訓練循環、分布式配置、日志管理等重復性工程工作。本文從基礎到進階&…

Apache Flink 實時流處理性能優化實踐指南

Apache Flink 實時流處理性能優化實踐指南 隨著大數據和實時計算需求不斷增長,Apache Flink 已經成為主流的流處理引擎。然而,在生產環境中,高并發、大吞吐量和低延遲的業務場景對 Flink 作業的性能提出了更高要求。本文將從原理層面深入解析…

ubuntu上將TempMonitor加入開機自動運行的方法

1.新建一個TempMonitor.sh文件,內容如下:#!/bin/bashcd /fjrobot/ ./TempMonitor &2.執行以下命令chmod x TempMonitor chmod x TempMonitor.sh rm -rf /etc/rc2.d/S56TempMonitor rm -rf /etc/init.d/TempMonitor cp /fjrobot/TempMonitor.sh /etc/…

速賣通自養號測評技術解析:IP、瀏覽器與風控規避的實戰方案

一、速賣通的“春天”來了,賣家如何抓住機會?2025年的夏天,速賣通的風頭正勁。從沙特市場躍升為第二大電商平臺,到8月大促返傭力度升級,平臺對優質商家的扶持政策越來越清晰。但與此同時,競爭也愈發激烈——…

adb: CreateProcessW failed: 系統找不到指定的文件

具體錯誤 adb devices * daemon not running; starting now at tcp:5037 adb: CreateProcessW failed: 系統找不到指定的文件。 (2) * failed to start daemon adb.exe: failed to check server version: cannot connect to daemon 下載最新的platform-tools-windows 下載最新…

Centos安裝HAProxy搭建Mysql高可用集群負載均衡

接上文MYSQL高可用集群搭建–docker https://blog.csdn.net/weixin_43914685/article/details/149647589?spm1001.2014.3001.5501 連接到你搭建的 Percona XtraDB Cluster (PXC) 數據庫集群,實現高可用性和負載均衡,建議使用一個中間件來管理這些連接。…

Sql server開掛的OPENJSON

以前一直用sql server2008,自從升級成sql server2019后,用OPENJSON的感覺像開掛,想想以前表作為參數傳輸時的痛苦,不堪回首。一》不堪回首 為了執行效率,很多時候希望將表作為參數傳給數據庫的存儲過程。存儲過程支持自…

【數據結構】隊列和棧練習

1.用隊列實現棧 225. 用隊列實現棧 - 力扣(LeetCode) typedef int QDatatype; typedef struct QueueNode {struct QueueNode *next;QDatatype data; }QNode;typedef struct Queue {QNode* head;QNode* tail;QDatatype size; }Que;typedef struct {Que…

LabVIEW二維碼實時識別

?LabVIEW通過機器視覺技術,集成適配硬件構建二維碼實時識別系統。通過圖像采集、預處理、定位及識別全流程自動化,解決復雜環境下二維碼識別效率低、準確率不足問題,滿足工業產線追溯、物流分揀等實時識別需求。應用場景適用于工業產線追溯&…

微服務-springcloud-springboot-Skywalking詳解(下載安裝)

一、SkyWalking核心介紹 1. 什么是SkyWalking? Apache SkyWalking是一款國人主導開發的開源APM(應用性能管理)系統,2015年由吳晟創建,2017年進入Apache孵化器,2019年畢業成為Apache頂級項目。它通過分布式…

Elasticsearch 字段值過長導致索引報錯問題排查與解決經驗總結

在最近使用 Elasticsearch 的過程中,我遇到了一個 字段值過長導致索引失敗 的問題。經過排查和多次嘗試,最終通過設置字段 "index": false 方式解決。本文將從問題現象、排查過程、問題分析、解決方案和建議等方面,詳細記錄這次踩坑…

使用idea 將一個git分支的部分記錄合并到git另一個分支

場景: 有多個版本分支,需要將其中一個分支的某一兩次提交合并到指定分支上 eg: 將v1.0.0分支中指定提交記錄 合并到 v1.0.1分支中 操作: 步驟一 idea切換項目分支到v1.0.1(需要合并到哪個分支就先站到哪個分支上) 步驟二 在ide…

基于深度學習的圖像分類:使用ShuffleNet實現高效分類

前言 圖像分類是計算機視覺領域中的一個基礎任務,其目標是將輸入的圖像分配到預定義的類別中。近年來,深度學習技術,尤其是卷積神經網絡(CNN),在圖像分類任務中取得了顯著的進展。ShuffleNet是一種輕量級的…