阅读更多

2顶
0踩

Web前端

转载新闻 从V8 JS引擎学到的优化经验

2015-02-12 10:33 by 副主编 mengyidan1988 评论(5) 有8117人浏览
V8是谷歌开源的一个高性能JavaScript引擎,用 C++ 实现,并用在谷歌的开源浏览器Chrome里。

为什么V8非常快,哪种方案让V8达到这种速度?发现其中秘密是一件有趣的事情。

面向对象、设计模式与性能

有些C/C++开发者有些奇怪的观念。他们认为使用面向对象和设计模式会降低程序的性能。但V8证明了这种观念是错误的。V8的实现使用了许多设计模式,但依然非常高效。

下面列出V8中使用的两个模式:

工厂模式

当Javascript引擎执行一个脚本时,引擎为遇到的每个变量、函数或数组都创建一个实例。JSObject是所有这些对象的父对象。

下面列出了所有继承自JSObject的类:



V8实现了一个工厂类来创建这些对象,该类中的Factory::NewJsObject就是用来创建这些对象的。

下面列出了所有使用该类/方法的方法。



V8引擎中的类并没有直接使用这个工厂类,而是添加了另一层封装,通过Heap类调用该工厂类。

访问者模式:

维基百科上这样解释观察者模式:

观察者设计模式是将算法和算法处理的对象分开的一种方式。这种分离可以在不修改结构本身的情况下,将新的操作添加到已有的对象结构上。这是一条遵循open/closed准则的方式。

与工厂模式相似,访问者模式也为实现添加了封装层。这样让其代码更加可读且可维护。

V8源码中许多类都实现了访问者模式。



即使V8开发者必须优化执行效率,他们也不在乎添加到代码中的封装层。使用设计模式和添加一些C++的机制会增加一些封装,所以的确会对效率有影响。但这对效率的影响仅占一小部分,更多的影响来自该应用使用的设计决策。

V8中针对执行效率方面的设计决策

1. 隐藏类和快速属性访问。

JavaScript是一种动态编程语言:可以在对象运行时为对象添加或删除熟悉。这意味着很容易改变对象的属性。

JSFunction和JSValue的父类都是JSObject,JSFunction用来表示一个javascript函数,JSValue用来表示一个javascript值。但没有继承自JSObject的类,用以表示Function或Value这样的Class。许多JavaScript引擎使用词典类型的数据结构来存储这些对象的熟悉,访问每个属性都需要动态查找并解析属性在内存中的位置。

这种方式导致JavaScript在访问对象变量的属性时,比在Java或Smalltalk中要慢。在这些语言中,实列变量分配的位置是固定的,即由编译器根据对象的类定义中的布局,在该对象在内存中的位置加上固定的偏移位置。因此访问这些属性仅仅是内存上的读取或存储,而这种操作通常只需一条指令。

V8使用隐藏类概念来降低访问JavaScript属性所消耗的时间。V8不使用动态查询来访问属性,而是在幕后创建隐藏类。

2. 动态生产机器码

在首次执行时,V8就将JavaScript源码直接编译成机器码,没有中间字节码,没有解释器。属性访问由内联的缓存代码处理,V8执行时可能会有其他机器指令修改这些缓存代码。

3. 高效的垃圾收集器

在执行过程中,V8会重新获得废弃对象的内存,即垃圾回收。为了保证拥有较快的对象分类、较短的垃圾回收停顿,以及没有内存碎片。V8使用了停顿、分代、精确垃圾回收器。这意味着V8使用了:

  • 在垃圾回收循环期间停止程序的执行。
  • 在大多数垃圾循环中,只处理对象堆的一部分。这最大化降低了停顿对应用的影响。
  • 记录所有对象和指针在内存中的位置,避免了将对象作为指针识别而导致的内存泄漏。

结论:

出于效率因素而不使用面向对象或设计模式,这是一个错误的观念。这样只会获得数毫秒的优化,却失去了代码的可读性和可维护性。

英文出处:www.codergears.com
  • 大小: 79.9 KB
  • 大小: 93.8 KB
  • 大小: 118.4 KB
2
0
评论 共 5 条 请登录后发表评论
5 楼 qianjigui 2015-03-15 12:00
感觉就翻译了下V8的基本介绍.
4 楼 yunnysunny 2015-02-13 11:28
ykssky 写道
vs 亮了...

这里面用的工具是vs?
3 楼 mike8625 2015-02-13 11:22
基本上没看懂,对于一个前端开发者挺需要的原理,如果看了这篇文章我看没几个人明白.
原理简单来说就是v8在运行js的时候,在一定的条件下先把一部分代码编译一下,然后再运行,所以就快了.
2 楼 ykssky 2015-02-12 23:38
vs 亮了...
1 楼 midstr 2015-02-12 15:03
结论和标题感觉差好远啊?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • C# PropertyGrid控件的分成 多层 折叠 和绑定自定义控件

    自己编写的 主要想自己留着备份的 带有绑定控件 分层 类目。亲们喜欢也可以下载参考参考

  • C#控件PropertyGrid使用

    二、创建一个类并新增需要的属性和字段,用于添加到propertyGrid控件上显示,并用XML序列化和反序列化,保存在本地和读取显示。四、用反射设定propertyGrid控件第1列(属性名称)的列宽,说明窗口高度,属性显示或隐藏。三、用特性设定类中属性和字段,在propertyGrid控件上的:名称、显示、分组、描述。一、创建winform并在界面添加propertyGrid控件。

  • c# propertyGrid下拉选项

    实现下面效果的propertygrid属性下拉选择 具体代码如下 //form窗口类 public partial class Form1 : Form { public Form1() { InitializeComponent(); properties ps = new properti...

  • c#中PropertyGrid控件联合TypeConverter进行数据转换

    c#中Property控件和TypeConverter类的使用

  • Property Grid 控件[转]

    1.将Property Grid 控件添加到工具箱中 由于默认情况下Property Grid 控件没有显示在工具箱中所以需要手动添加。 图1 将Property Grid添加到工具箱(在工具箱上右键选择添加/移除项) 图2 在自定义工具箱对话框中选中PropertyGrid控件 2.编写自定义类,并跟PropertyGrid控件进行绑定 using System;...

  • winform控件PropertyGrid的应用(使运行中的程序能像vistual studio那样设置控件属性)

    像有些卡业务流程或者调用第三方的接口的业务逻辑,某些机器因某种原因需要临时关闭该功能,就可以使用该控件实现个性化控制了,我上一家公司是用一个表来存储这种个性化设置参数,这样就要向数据库中查询一次,有点浪费性能了。好了,下面就和我一起体验一下该控件吧,当然网上也有很多博客教程了,本文就简单意思一下就行,核心就是设置PropertyGrid控件的SelectedObject属性为对应的Control控件。代码中添加了自定义属性NewProp,属性上的标记信息用于程序在运行时显示的属性信息。好了,本文到此结束。

  • C#下PropertyGrid使用

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Ref

  • C#中的PropertyGrid控件在WinForm调试中的妙用

    PropertyGrid,提供用于浏览对象属性的用户界面。在WinForm设计界面,点击某一个控件,选择“属性”页,可以看到控件的各个属性与对应的值,而用于展示这些信息的,就是PropertyGrid控件。 我们在进行WinForm程序设计与调试的时候,当需要修改控件的属性,如文本颜色、背景颜色、文本内容时,我们只能停止调试,重新设置属性再调试;有时候还要获取控件无法直接显示的属性,如...

  • PropertyGrid控件由浅入深(二):基础用法

    目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要素: 属性名称 属性的名称、标题。 属性编辑器(属性值) 这里显示的是属性的当前值,显示的一般为文字,也可以以图标的形式。编辑器会自动根据数据的类型定义一个验证器,比如属性类型为int类型,你是无法输入字符内容的。另外,一般属性的编辑是直接在属性值这栏直接输入,但是复杂的属性,一般都会提供一

  • PropertyGrid控件由浅入深(一)

    http://i2.feixin.10086.cn/pages/78831/1343441380 http://i2.feixin.10086.cn/pages/78831/1343440538 http://i2.feixin.10086.cn/pages/78831/1343439618 http://i2.feixin.10086.cn/pages/78831/1343455691

  • C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

    【转 http://blog.csdn.net/ronotian/article/details/3183907】 既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞定,让PropertyGrid显示Control的所有属性。可是这里显...

  • c#——Winform PropertyGrid使用(二)

    PropertyGrid 自定义下拉 首先绘制自定义下拉的控件,使用UserControl,当然也可以下拉窗体。 我们这里使用的 是 UserControl 代码如下: using System.Reflection.Emit; using System.Windows.Forms; using System.Windows.Forms.Design; using Jura

  • 【C#】GridControl控件和数据集双向绑定

    当我需要往表格中插入删除数据时很麻烦,存在以下困惑: ① DataTable定义麻烦,你需定义列字段、添加列、添加行数据 ② DataTable删除某一行又很麻烦,你还需要循环找到该行,然后删除。 ③ 控件数据不能立即刷新,就是你DataTable新增了一行,控件它不显示,还需要刷新数据源GridControl_TBar.RefreshDataSource(); 是不是用起来超级繁琐,本文将给你提供解决方案,控件GridControl、DataGridView双向绑定数据集List,我们只需要对数据

  • C# PropertyGrid 加载动态属性

    最近在用winform做项目时,遇到大量要自定义动态配置的数据,为了减少工作量,考虑把数据类与PropertyGrid绑定,以达到简洁地进行数据加载和更改的目的,下面把Demo过程和相关代码记录下来作为备忘录,同时希望能给后来者带来帮助(在Demo过程中查阅了其他相关开发者的文章,在此对其作者表示感谢!)

  • c# PropertyGrid 自定义属性排序

    PropertyGrid属性如果不自定义顺序的话,属性会按照字母顺序排序。实际中这并不是想要的结果。可以通过增加一个PropertyOrder的方法,自定义属性的属性。这样就可以根据自己的意愿进行排序了。我先上一个Winform版本的PropertyGrid。过几天再上一个WPF版本的PropertyGrid排序。Wpf版本的排序将采用开源控件库HandyControl作为基础。它可以带来更好的展示。话不多说,先看下排序前后的效果: 还是排序后的效果看着舒服。 工程如下: 源码非常的...

  • C#获取文本框的任意行内容

    C#中 textbox.Lines.Length 可以获得文本框里文本的行数; 而textbox.Lines[ i ] 代表文本框任意一行的内容,所以获取文本框最后一行的方法为: string endline = textbox.Lines[textbox.Lines.Length-1]; 获得文本框的全部内容为: string [] arr = new string[textbox.Lines.Length]; for(int i =0 ;i<textbox.Lines.Length;i++

  • WPF编程,C#后台动态创建Grid,创建行,增加控件到指定行的一种方法。

    在事件中执行如下代码: Grid grid = new Grid(); RowDefinition row1 = new RowDefinition(); RowDefinition row2 = new RowDefinition(); row2.Height = new GridLength(...

  • pgp中碰到的问题

      在做PGP的skr破解过程中,碰到AES验证无法和源码出来的结果匹配上,于是想从源码中直接提取AES算法的实现。在提取的过程中碰到了一些问题,现记录如下:   1.#define t_set(m,n) pgpAEStab_##m##n 此宏的定义 其实就是别名的定义,通过后面代码的查看(如t_set(f,l)[0][i] = w)可以推测,t_set(f,l)的定义就是怕重名, t_se...

  • C# PropertyGrid使用总结

    1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过DescriptionAttribute设置描述,Attribute可以加在Class上,也可以加在属性上,属性上的Attribute优先级更高; 2. enum会自动使用列表框表示; 3. 自带输入有效性检查,如int类型输入do...

  • WinForm下的表格控件ReoGrid2.0使用示例 开源免费表格控件

    ReoGrid .NET Spreadsheet Component C# 和 VB.net 开源免费的表格控件, 界面很漂亮, 功能很强大 其它的自己搜一下吧,当前版本是2.0的使用示例

Global site tag (gtag.js) - Google Analytics