您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > JavaScript引擎的性能优化
JavaScript引擎的性能优化北京奇虎科技有限公司任寰提纲 JavaScript引擎优化的主要⽅方法- 导出类(hiddenclass)- 内联(Inlinecache)- JIT- 垃圾回收- 堆快照- 按需优化编译 最新进展- 世界之窗- Dart优化JavaScript的难点 动态类型语⾔言- 对象具备属性- 可以随时增减对象的属性- 不同属性的对象可以出现在同样的调⽤用中- 原型(prototype)链- 函数可以从⼀一个对象移到另⼀一个对象动态类型语⾔言functionPoint(x,y){this.x=x;this.y=y;}varp=newPoint(1,2);varq=newPoint(3,4);varp={};p.x=1;p.y=2;pObject{x:1,y:2}动态语⾔言中类的实现NameValuexy12PropertytableNameValuexy34PropertytableObjectpObjectq存取对象属性:字典查找(Hashtable)强类型NameOffsetxy01LayouttablePointArray0:1-xvalue1:2-yvalueObjectClass存取对象的成员:数组+位移隐藏类NameOffsetxy01LayouttablePointPropertyarray12HiddenClassPropertyarray34Pq类型转换functionPoint(x,y){this.x=x;this.y=y;}varp=newPoint(1,2);varq=newPoint(3,4);p.z=5;类型转换Point2Propertyarray 1 2 Propertyarray 3 4 P q NameOffsetxy01Layouttable PointNameOffsetxy01Layouttable z25 类型转换functionPoint(x,y){this.x=x;this.y=y;}varp=newPoint(1,2);varq=newPoint(3,4);p.z=5;q.z=6;类型转换Point2Propertyarray12PqNameOffsetxy01Layouttablez25PointNameOffsetxy01Layouttablez*Propertyarray346优化效果 90%的对象使⽤用同⼀一个隐藏类。 影响因素- 创建隐藏类的开销- 更新隐藏类的开销 建议- 在构造函数中初始化对象- 按同样的顺序初始化内联(InlineCache)Class*klass=p-get_class();intoffset=klass-lookup_offset(x);update_cache(klass,offset);returnp-properties[offset];;accessp.xCallpremonomorphic_stubpremonomorphic_stubmonomorphic_stubif(CACHED_KLASS==p-get_class()){returnp-properties[CACHED_OFFSET];}else{returnLoadIC_Miss(p,x);}MonomorphicStub0xf7c0d32d:[Code]Instructions(size=37)0xf7c0d34408b442404moveax,[esp+0x4]0xf7c0d3484a801testal,0x10xf7c0d34a60f8414000000jz320xf7c0d350128178ff81ab8ff7cmp[eax+0xff],0xf78fab810xf7c0d357190f8507000000jnz320xf7c0d35d258b5803movebx,[eax+0x3]0xf7c0d360288b4307moveax,[ebx+0x7]0xf7c0d36331c3ret0xf7c0d36432e993daffffjmpLoadIC_Miss对JIT编译 JSC(JavaScriptCore)的演进- 源码语法树解释器- 源码bytecode解释器(SquirrelFish)- 源码bytecodeJIT执⾏行(SFExtreme) V8- 源码JIT执⾏行垃圾回收 精准回收(precisegarbagecollection)- 分代式回收(generational) 标记(TaggedValues)Objectpointer31-bitsignedinteger10ObjectsSMallIntegers• 建议:尽量进⾏行2^30内的数值运算垃圾回收和DOMDOM对象不能有循环依赖。图GoogleJavaScript库 JavaScript的标准库(ECMA262)⽤用JavaScript实现 优点- 开发速度,维护成本- 发掘V8引擎的优势 缺点- 初始化:30ms堆快照 ⽤用快照(snapshot)直接初始化堆(objectheap)- 快速序列化- 内置编译好的JavaScript库- 编译时⽣生成快照。 启动时间:4-8ms⾃自适应编译JavaScript源码⼆二进制代码优化的⼆二进制代码⾸首次调⽤用多次调⽤用优化失败InlineCaches性能提升历程ChromeV8团队代码复杂度ChromeV8团队还需要再快吗?ChromeV8团队还能再快吗? Blink/V8- DOM性能与内存管理 世界之窗6.0- JavaScript库- VM⾃自⾝身的代码优化 突破JavaScript语⾔言的局限- Dart世界之窗6.0 Dart语⾔言- JavaScript语法- 更简单的对象模型 Dart2js- ⽣生成更利于优化的JavaScript代码Chrome双核浏览器360SE6.0世界之窗6.0200920122013IE69%IE71%IE816%360安全浏览器36%IE93%360极速浏览器7%⾕谷歌浏览器5%搜狗⾼高速浏览器12%Maxthon4%MozillaFirefox2%QQ浏览器2%2%1%为明天⽽而优化谢谢!
本文标题:JavaScript引擎的性能优化
链接地址:https://www.777doc.com/doc-5359819 .html