javascript 性能的总结--JIT

本文探讨了JIT(即时编译)技术如何通过Inline Caching提高JavaScript性能,尤其是在对象属性查找方面,并分析了其在不同继承层级上的表现。

1. JIT(just-in-time)

    这是一项能让脚本执行的更快的汇编技术。其中在IOS safari  ,andriod  chrome上都是可用了,但是在IOS chrome(使用的UIWebView)中,由于Apple的第三方应用的限制,该技术并不可用,所以网上出现了ios chrome 比ios safari要慢三倍的结论。

   下面主要从JIT来对javascript的性能进行讨论:

   1.1 inline caching

   这是一项JIT中引入的技术:

    例如我们要执行下面这个:

function foo(obj)

{

    return obj.a;

}

  要做下面事情:

1. 在当前对象中查找obj的a属性,------------------------------》比较慢

2.第一步不成功,则需要到prototype chain中继续查找-----》更加慢

3. 找到该属性,取得属性的值;----------------------------------》取值是很快的

而inline caching的引入,就很好的解决了上面两个比较费时的操作, 它的主要原理如下:

1. 按照前面的的三步,做类似的事情---------------------------》费时

2. 但是他会记录前面的步骤,这主要是用JIT来完成的(通过一小段的汇编代码)

3. 下次再查找是,先从caching中查找(由2,8原则),这样查找就很快,其中效率的提升主要在重复的查找上,。

例如:

var obj1 = {a : 1 , b : 2 . c : 3 , d : 4};
var obj2 = {a : 1 , c : 2};
 function foo(obj)

{

   return obj.c;

};

下面我们在看一下继承中,inline caching所带来的好处:

   prototype在写OOP的编程是,会经常用到,再出现继承层次比较多的时候,效率会怎样呢?下面我们来看一个例子:

function A(x)

{

    this.x  = x;

}

function B(y)

{

    this.y = y;

};

B.prototype = new A;

function C(z)

{

    this.z = z;

}

C.prototype = new B;

上面定义了三种具有继承关系的类;

当我们些出下面这段代码时:

var obj1 = new C(1);
var obj2 = new C(2);
var obj3 = new C(3);

由于前面提到inline caching会记录查找的结果(通过汇编代码), 因此三个对象的创建过程如下:


可以看出,利用inline caching,在继承层次较深时,有很好的性能保证!

但是也需要注意:

假设下面这个函数的参数能接受很多类型的对象:

function foo(obj)

{

   return obj.c;

};
那么inline caching中就会有一条记录链,当要查找记录链比较靠后的对象记录是,是比较费时的。因为每次都必须从记录链头开始查找:
这种情况下各个游览器的性能如下:



其中可以看出在chrome中,当创建的对象较多是,性能是很受影响的!
关于JIT的inline caching就写到这里,已经继续其他的方面的讨论!CSDN编辑器真的差劲,当要上传图片


我很无语


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值