深入V8引擎-Time模塊介紹

来源:https://www.cnblogs.com/QH-Jimmy/archive/2019/05/24/10909586.html
-Advertisement-
Play Games

積跬步,行千里,先從最簡單的開始寫。 這一篇介紹V8中的時間模塊,與libuv粗糙的update_loop_time方法不同,V8有一套獨立完整的類負責管理時間。 該類位於src/base/platform/time.h,是一個輔助模塊,首先來看一下繼承樹。 整個模塊的繼承關係比較簡單,一般常用的就 ...


  積跬步,行千里,先從最簡單的開始寫。

  這一篇介紹V8中的時間模塊,與libuv粗糙的update_loop_time方法不同,V8有一套獨立完整的類負責管理時間。

  該類位於src/base/platform/time.h,是一個輔助模塊,首先來看一下繼承樹。

  整個模塊的繼承關係比較簡單,一般常用的就是Time、TimeTicks類,這裡挨個進行介紹吧。

 

TimeConstants

  這個類很直接,只是定義一些常量,比如一星期有7天,一天有24小時,一小時有60分鐘等等……

class TimeConstants {
 public:
  static constexpr int64_t kHoursPerDay = 24;
  static constexpr int64_t kMillisecondsPerSecond = 1000;
  static constexpr int64_t kMillisecondsPerDay =
      kMillisecondsPerSecond * 60 * 60 * kHoursPerDay;
  // ...
};

 

TimeDelta

  這個類提供把各種單位的時間轉換為microseconds的方法。

class V8_BASE_EXPORT TimeDelta final {
 public:
  constexpr TimeDelta() : delta_(0) {}

  // Converts units of time to TimeDeltas.
  static constexpr TimeDelta FromDays(int days) {
    return TimeDelta(days * TimeConstants::kMicrosecondsPerDay);
  }
  // ...
}

  這裡的常數定義來源於上面的TimeConstants類。

 

TimeBase

  這個類沒啥好說的,比較特殊的地方就是這是個模版類,提供對給定類型的時間序列化功能。

template <class TimeClass>
class TimeBase : public TimeConstants {
 public:
  // ...

  int64_t ToInternalValue() const { return us_; }

  // ...

  static TimeClass FromInternalValue(int64_t us) { return TimeClass(us); }
 protected:
  explicit constexpr TimeBase(int64_t us) : us_(us) {}

  // Time value in a microsecond timebase.
  int64_t us_;
};

 

Time

  Time類負責管理JavaScript中Date.now生成的時間戳,用的比較多所以這裡就不解釋了。

// -----------------------------------------------------------------------------
// Time
//
// This class represents an absolute point in time, internally represented as
// microseconds (s/1,000,000) since 00:00:00 UTC, January 1, 1970.

class V8_BASE_EXPORT Time final : public time_internal::TimeBase<Time> {
  // ...
};

  關於類的介紹,在註釋裡面都寫的很明白了,需要註意的是在不同的操作系統,這些方法的表現天差地別,甚至有些方法僅在指定的操作系統才能生效。

 

TimeTicks

// -----------------------------------------------------------------------------
// TimeTicks
//
// This class represents an abstract time that is most of the time incrementing
// for use in measuring time durations. It is internally represented in
// microseconds.  It can not be converted to a human-readable time, but is
// guaranteed not to decrease (if the user changes the computer clock,
// Time::Now() may actually decrease or jump).  But note that TimeTicks may
// "stand still", for example if the computer suspended.

class V8_BASE_EXPORT TimeTicks final : public time_internal::TimeBase<TimeTicks> {
  // ...
};

  註釋相當的精細。

  TimeTicks這個類則負責另外一種時間戳,在淺析libuv源碼-獲取精確時間中有進行過介紹。比如在windows中,有兩種計數API,分別返回系統"心跳"一次所花時間與"心跳"次數,由於頻繁總是固定不變,所以可以根據每次返回的次數來進行計時。

  這類事件戳比起上的Time優勢在於可以保證數值一直在增加,並且不會受外界因素影響(機器掛了另算)。所以無論是libuv設置輪詢開始時間或處理定時器任務,還是V8在對JS代碼進行編譯計時,都是用的這個。

  最後的ThreadTicks就暫時不看了,等到時候用上了再做解釋。

  這一篇先簡單介紹一下,後面再深入講一講在不同操作系統下的,兩類時間戳的具體實現。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝zookeeper(單機) 下載bin.tar.gz的版本,解壓 conf下的zoo_sample.cfg改zoo.cfg zoo.cfg里添加配置 啟動zookeeper服務 bin\zkServer.cmd 安裝dubbo-admin http://dubbo.apache.org/en-u ...
  • 一、什麼是觀察者模式 觀察者一般可以看做是第三者,比如在學校上自習的時候,大家肯定都有過交頭接耳、各種玩耍的經歷,這時總會有一個“放風”的小伙伴,當老師即將出現時及時“通知”大家老師來了。再比如,拍賣會的時候,大家相互叫價,拍賣師會觀察最高標價,然後通知給其它競價者競價,這就是一個觀察者模式。 對於 ...
  • SaltStack使用salt-ssh模式 salt-ssh 介紹 參考官檔 salt-ssh是 0.17.0 新引入的一個功能,不需要minion對客戶端進行管理,也可以不需要master;salt-ssh也支持salt大部分的功能:比如grains,modules,state等;salt-ssh ...
  • 委托定義類型,類型指定特定方法簽名。 可將滿足此簽名的方法(靜態或實例)分配給該類型的變數,然後(使用適當參數)直接調用該方法,或將其作為參數本身傳遞給另一方法再進行調用。 以下示例演示了委托的用法。 public delegate string Reverse(string s); 行創建特定簽名 ...
  • 1,C++ 中繼承是非常重要的一個特性,本節課研究在繼承的情形下,C++ 的對象模 型又有什麼不同; 2,繼承對象模型(最簡單的情況下): 1,在 C++ 編譯器的內部類可以理解為結構體; 2,子類是由父類成員疊加子類新成員得到的; 1,代碼示例: 1 class Derived : public ...
  • 0基礎、非電腦專業怎麼學Python?其中最重要的,我想就是基礎的夯實。掌握好Python語法等基礎知識,才能在做項目時事半功倍。今天我們就來看看2位前輩是怎麼自學Python的。希望對你有所幫助。 ...
  • 1.二維矩陣的轉置 2.矩陣相加,A,B矩陣均需要為一個N*M的矩陣,即相加矩陣的行和列必須相等 3.矩陣相乘,A,B矩陣需要滿足條件為A為m*n的矩陣,B為n*p的矩陣,結果C為m*p的矩陣 4.編寫函數利用三項式壓縮稀疏矩陣稀疏矩陣:一個矩陣的大部分元素為0,則是稀疏矩陣 三項式:非零項用(i, ...
  • 所屬網站分類: 面試經典 > python 作者:外星人入侵 鏈接: http://www.pythonheidong.com/blog/article/13/ 來源:python黑洞網 www.pythonheidong.com webbrowser模塊提供了一個高級介面來顯示基於Web的文檔,大 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...