积跬步,行千里,先从最简单的开始写。

  这一篇介绍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模块介绍相关推荐

  1. javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探

    本文主要就下面三块内容展开 栈和堆空间 垃圾回收 解释器和编译器 一.栈空间和堆空间 先回顾下基本知识 1.静态语言就是强类型?二者的关系 (1-1)静态语言, 使用前 要确定数据类型 (1-2)动态 ...

  2. 浏览器原理-v8引擎-js执行原理

    浏览器原理-v8引擎-js执行原理 js简介 js应用: js的应用很广泛 可以应用于web,移动端,小程序,桌面应用,后端开发等 web开发包括(原生js,react,vue,angular等) 移 ...

  3. Chrome V8引擎介绍

    0.v8引擎出现的原因 这里先说一下什么是编译型语言和解释性语言: 编译型语言: 在程序执行之前必须进行专门的编译过程,有如下特点: 只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译, ...

  4. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  5. node JS獲取GPS_Node.js 14 正式发布:V8 引擎升级,新增异步本地存储 API

    Node.js 14 版本于近日正式发布, 此版本包含的亮点如下: 对诊断功能的改进 升级 v8 引擎 新增实验性的异步本地存储 API 强化流 API 移除实验性模块中的警告 移除一部分早期版本中废 ...

  6. 精读《V8 引擎 Lazy Parsing》

    1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...

  7. V8 引擎是如何工作的?

    作者 | Fundebug 最近,JavaScript生态系统又多了2个非常硬核的项目. 大神Fabrice Bellard发布了一个新的JS引擎QuickJS,可以将JavaScript源码转换为C ...

  8. v8引擎处理html,JavaScript V8引擎基础教程

    本篇教程介绍了JavaScript V8引擎基础教程,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < 一.浏览器内核-渲染引擎 渲染,就是根据描述或者定义构 ...

  9. Webkit模块介绍

    一.Webkit模块 用到的第三方库如下: cairo 一个2D绘图库 casqt Unicode处理用的库,从QT中抽取部分代码形成的 expat 一个XML SAX解析器的库 freetype 矢 ...

最新文章

  1. ICLR 2022|唯快不破!面向极限压缩的全二值化BiBERT
  2. 攻防世界 适合做桌面_FIFA足球世界球员特性解析:精神篇
  3. linux 串口特别是接收
  4. 电商搜索能力解读-实体识别(NER)
  5. python waitkey_python中VideoCapture(),read(),waitKey()的使用
  6. java并发库之Executors常用的创建ExecutorService的几个方法说明
  7. mongodb示例_MongoDB findAndModify()示例
  8. selenium自动化之元素高亮显示
  9. 问题-Ctrl+F7跟踪值时提示“Function to be called, TGGLPolyhedron3d.AsString, was eliminated by linker”...
  10. python条件、循环、终止
  11. Java中resualtset,Java SafeEncoder類代碼示例
  12. PHP redis key
  13. 开源代码01:眼力大挑战
  14. python编程做联机游戏大全单机_如何将一款单机双人的游戏做成联机版?
  15. 2018 年秋季 10 月江苏省计算机等级考试回忆(二级 Python)
  16. 在使用Less除法运算时,报错(css不出结果)
  17. 2023最新盲盒H5商城系统小程序源码+支持抽奖功能/VUE内核开发
  18. 根据ICCID反查手机号码的五种终极方法
  19. 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇
  20. 在家可以挣钱的工作,这9个工作可以考虑做一下!

热门文章

  1. 如何在QT中读取串口数据
  2. MFC 获取命令行参数
  3. POJ-2186 Popular Cows (Tarjan缩点) 文末有测试数据
  4. LeTax如何多行注释
  5. java经典100例算法题_10道java经典算法题,每一题都能帮你提升java水平!
  6. 缓存层redis总结
  7. 快速上手ANTLR--在Windows环境下解析计算器指令语法
  8. x265-确定slice type-2
  9. 引用类型String的操作
  10. linux 更改文件夹大小,Linux下改变文件大小