深入V8引擎-Time模块介绍
積跬步,行千里,先從最簡(jiǎn)單的開始寫。
這一篇介紹V8中的時(shí)間模塊,與libuv粗糙的update_loop_time方法不同,V8有一套獨(dú)立完整的類負(fù)責(zé)管理時(shí)間。
該類位于src/base/platform/time.h,是一個(gè)輔助模塊,首先來看一下繼承樹。
整個(gè)模塊的繼承關(guān)系比較簡(jiǎn)單,一般常用的就是Time、TimeTicks類,這里挨個(gè)進(jìn)行介紹吧。
?
TimeConstants
這個(gè)類很直接,只是定義一些常量,比如一星期有7天,一天有24小時(shí),一小時(shí)有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
這個(gè)類提供把各種單位的時(shí)間轉(zhuǎn)換為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);}// ... }這里的常數(shù)定義來源于上面的TimeConstants類。
?
TimeBase
這個(gè)類沒啥好說的,比較特殊的地方就是這是個(gè)模版類,提供對(duì)給定類型的時(shí)間序列化功能。
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類負(fù)責(zé)管理JavaScript中Date.now生成的時(shí)間戳,用的比較多所以這里就不解釋了。
// ----------------------------------------------------------------------------- // 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> {// ... };關(guān)于類的介紹,在注釋里面都寫的很明白了,需要注意的是在不同的操作系統(tǒng),這些方法的表現(xiàn)天差地別,甚至有些方法僅在指定的操作系統(tǒng)才能生效。
?
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> {// ... };注釋相當(dāng)?shù)木?xì)。
TimeTicks這個(gè)類則負(fù)責(zé)另外一種時(shí)間戳,在淺析libuv源碼-獲取精確時(shí)間中有進(jìn)行過介紹。比如在windows中,有兩種計(jì)數(shù)API,分別返回系統(tǒng)"心跳"一次所花時(shí)間與"心跳"次數(shù),由于頻繁總是固定不變,所以可以根據(jù)每次返回的次數(shù)來進(jìn)行計(jì)時(shí)。
這類事件戳比起上的Time優(yōu)勢(shì)在于可以保證數(shù)值一直在增加,并且不會(huì)受外界因素影響(機(jī)器掛了另算)。所以無論是libuv設(shè)置輪詢開始時(shí)間或處理定時(shí)器任務(wù),還是V8在對(duì)JS代碼進(jìn)行編譯計(jì)時(shí),都是用的這個(gè)。
最后的ThreadTicks就暫時(shí)不看了,等到時(shí)候用上了再做解釋。
這一篇先簡(jiǎn)單介紹一下,后面再深入講一講在不同操作系統(tǒng)下的,兩類時(shí)間戳的具體實(shí)現(xiàn)。
轉(zhuǎn)載于:https://www.cnblogs.com/QH-Jimmy/p/10909586.html
總結(jié)
以上是生活随笔為你收集整理的深入V8引擎-Time模块介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP7新增的主要特性
- 下一篇: Winfrom 弹出窗体位置设定