深入V8引擎-Time模块介绍
积跬步,行千里,先从最简单的开始写。
这一篇介绍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就暂时不看了,等到时候用上了再做解释。
这一篇先简单介绍一下,后面再深入讲一讲在不同操作系统下的,两类时间戳的具体实现。
转载于:https://www.cnblogs.com/QH-Jimmy/p/10909586.html
深入V8引擎-Time模块介绍相关推荐
- javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探
本文主要就下面三块内容展开 栈和堆空间 垃圾回收 解释器和编译器 一.栈空间和堆空间 先回顾下基本知识 1.静态语言就是强类型?二者的关系 (1-1)静态语言, 使用前 要确定数据类型 (1-2)动态 ...
- 浏览器原理-v8引擎-js执行原理
浏览器原理-v8引擎-js执行原理 js简介 js应用: js的应用很广泛 可以应用于web,移动端,小程序,桌面应用,后端开发等 web开发包括(原生js,react,vue,angular等) 移 ...
- Chrome V8引擎介绍
0.v8引擎出现的原因 这里先说一下什么是编译型语言和解释性语言: 编译型语言: 在程序执行之前必须进行专门的编译过程,有如下特点: 只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译, ...
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- node JS獲取GPS_Node.js 14 正式发布:V8 引擎升级,新增异步本地存储 API
Node.js 14 版本于近日正式发布, 此版本包含的亮点如下: 对诊断功能的改进 升级 v8 引擎 新增实验性的异步本地存储 API 强化流 API 移除实验性模块中的警告 移除一部分早期版本中废 ...
- 精读《V8 引擎 Lazy Parsing》
1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...
- V8 引擎是如何工作的?
作者 | Fundebug 最近,JavaScript生态系统又多了2个非常硬核的项目. 大神Fabrice Bellard发布了一个新的JS引擎QuickJS,可以将JavaScript源码转换为C ...
- v8引擎处理html,JavaScript V8引擎基础教程
本篇教程介绍了JavaScript V8引擎基础教程,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < 一.浏览器内核-渲染引擎 渲染,就是根据描述或者定义构 ...
- Webkit模块介绍
一.Webkit模块 用到的第三方库如下: cairo 一个2D绘图库 casqt Unicode处理用的库,从QT中抽取部分代码形成的 expat 一个XML SAX解析器的库 freetype 矢 ...
最新文章
- ICLR 2022|唯快不破!面向极限压缩的全二值化BiBERT
- 攻防世界 适合做桌面_FIFA足球世界球员特性解析:精神篇
- linux 串口特别是接收
- 电商搜索能力解读-实体识别(NER)
- python waitkey_python中VideoCapture(),read(),waitKey()的使用
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- mongodb示例_MongoDB findAndModify()示例
- selenium自动化之元素高亮显示
- 问题-Ctrl+F7跟踪值时提示“Function to be called, TGGLPolyhedron3d.AsString, was eliminated by linker”...
- python条件、循环、终止
- Java中resualtset,Java SafeEncoder類代碼示例
- PHP redis key
- 开源代码01:眼力大挑战
- python编程做联机游戏大全单机_如何将一款单机双人的游戏做成联机版?
- 2018 年秋季 10 月江苏省计算机等级考试回忆(二级 Python)
- 在使用Less除法运算时,报错(css不出结果)
- 2023最新盲盒H5商城系统小程序源码+支持抽奖功能/VUE内核开发
- 根据ICCID反查手机号码的五种终极方法
- 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇
- 在家可以挣钱的工作,这9个工作可以考虑做一下!