-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
深入JS引擎:如何让你的JS更快 #5
Comments
较新版本的V8已经对throw/try-catch进行了优化, 具体可以看老司机 @justjavac 的博客, 戳戳戳 |
@xxmyjk 并且现在的JIT把boxed和unbox的完善了,直接执行操作了,感谢提供的博客,知识很好 |
关于总结的第三点,请问下,变量赋null之后再进行赋值,这样算不算改变了数据类型? |
@MarvinWilliam 如果赋值的是对象,不算,null本身也是对象,且是原型链的最顶层 |
@Redshao 哦,明白了. 那如果我们未对变量初始化,那就是undefined了,这个在赋值之后应该不算改变数据类型吧? |
@MarvinWilliam |
@Redshao 完全明白了.谢谢. : ) |
请问“判断效率稠密>if>稀疏”具体是指什么? |
感谢 @xxmyjk 提到我的博客,但是我的博客并没有同步更新 V8 的知识。至于提到的 throw/catch 已经可以优化,是在最新的 V8 实现中,使用 TurboFan 引擎替换了 Crankshaft。 推荐我专栏中的两篇文章吧: 我之所以开始写 V8 专栏,就是因为网站关于 V8 的文章都过于古老,等到翻译成中文,就更古老了。但是 V8 的发展非常迅速,可能是因为 JS 发展太过迅速了吧。包括引入了解释器(之前 V8 没有解释器,只有通用编译器和优化编译器),更换了新的优化引擎,增加了对 wasm 的支持等。。。。 |
@FailLone 判断的效率是指你要判断对象的数据稠密度,稀疏的数据中显示的个数不代表所拥有的真实数据,所以查找的效率上就低,数据稠密用switch的效率比if要高,最差的就是稀疏的数据 |
@justjavac 是的,这是一篇比较老的PPT,近两年JavaScript的开发者以倍数增长,刺激引擎的更新乃至迭代不可避免,只是很多JSer包括我自己知其然却不知其所以然,所以看到一些好的文章拿出来当做一个读后笔记 |
感谢楼主!收获很大~ |
Know Your Engines
How to Make Your JavaScript Fast
看到了一篇旧文,是Mozilla公司的JS引擎工程师Dave的PPT,很多JS开发者都知道JS的效率很低,虽然JS无类型的特性让我们代码写的很爽,比如
我们根本不用管a初始的类型是
string
还是number
,直接赋上我们想要的值就行,但是js引擎处理这些无类型的代码却并不轻松,当然这在JIT之前,但是JIT也并不是万能的要处理这样一段代码
x = y + z;
JS引擎处理无类型的代码要进行一个boxed(装箱)和unbox(解箱)的行为
要处理这样一段代码
看到上面的JS引擎处理代码的步骤,一眼就能看出其实我们想要的就是第五步,我们写代码不就是想让引擎帮我们执行操作么,但是JS无类型的特性让引擎不得不进行一些boxed和unbox行为,有了JIT之后
从内存中读取x = y + z的操作符从内存中读取y、z并装箱x装箱完毕后将x写入内存1,2两步CPU帮我们做了,第7步JIT将代码保存到寄存器里面去
通常情况下JIT帮我们快速的编译代码,并且正则有专门的JIT编译,所以正则通常比手动搜索要快
IC(inline caching)
我们要找到一个obj里面叫a的属性,我们知道JS对象是基于prototype的,所以会一层链一层链的往上找,这是非常慢的,但是一旦找到了,获得属性的值是非常快的
所以有对Object处理的一个mini JIT,称它为IC,IC会为对象首次搜索后建立cache
总结
eval
和with
var arr = []; arr[10000] = 1;
The text was updated successfully, but these errors were encountered: