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编辑器真的差劲,当要上传图片
本文探讨了JIT(即时编译)技术如何通过Inline Caching提高JavaScript性能,尤其是在对象属性查找方面,并分析了其在不同继承层级上的表现。
270

被折叠的 条评论
为什么被折叠?



