加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

传说中的JS神器 Asm.js

(2017-08-06 20:58:06)
标签:

asmjs

javascript

性能

神话

分类: IT杂谈
说起Javascript,一般人可能担心最多的就是性能吧。Js作为一门在浏览器中解释执行的脚本语言,其性能肯定是远远赶不上的Java,C、C++等一众编译执行的静态语言。但是架不住网页上基本都只支持它,而Web特别是HTML5最近又特别火,所以性能再不好,用的人多了,想的办法多了,性能也就会好起来了。

要说Javascript的性能,各个浏览器是使净了洪荒之力,搞出了诸如谷歌的V8之类的Js 引擎。作为程序员来讲,我们关注的还是如何写出在各个浏览器上的都跑的贼快的代码。代码优化是一个方面,在Js里还有一个传说般的存在 ASM.js.这货最先是Mozilla搞出来的,现在谷歌的chrome和微软的Edge都支持了。http://s3/mw690/001B6Jtvzy7dexada5c82&690Asm.js" TITLE="传说中的JS神器 Asm.js" />

说起ASM.js,挺名气就挺霸气,按照ASM(汇编)的效率来执行JS。其实“asm.js是由Mozilla提出的一个基于JS的语法标准,主要是为了解决JS引擎的执行效率问题,尤其是使用Emscripten从C/C++语言编译成JS的程序的效率,”。从理论上讲,只要按照ASM.js规范的要求来写JS,其运行的时候底层代码引擎就会将JS编译成本地代码执行,从而大大提高执行效率。

这听起来感觉不错,并且ASM. js要求的写法也是极其变态的(具体见下面的例子),但这也拦不住咱一颗追求极致性能的决心。终于下了好大的决心,忍住了好多的恶心(被其变态的语法恶心的),突然才发现这货其实也没啥大用:
语法极其变态,使用场景极其有限,性能提升有限。
一般一个标准的asm.js模块是以一个函数来封装的。函数声明一般是
function asmModule(stdlib, foreign, heap) {
,这里第一个参数一般都是window,第二个参数没搞清除有啥大用,第三个参数就是一般翻译做运行的堆内存,但是其实我觉得他是最有用的,他是唯一一个可能向ASM.js模块传输大量数据的参数,但是类型必须是typedarray,并且长度要求必须的2的幂。其通过return参数暴露出来的函数的参数和返回值只能是整数和浮点数,这就意味着你要传递数组到ASM.js的模块中,实际上你只能通过模块声明函数的heap参数传递一个数组。问题是JS里是没有提供typedarray合并的方法的,通过原生JS数组合并操作typedarray也是慢的要命。并且经过我测试,在对数组的值计算不复杂的情况下(几次加减乘除),其计算性能其实没比原始js计算有什么提升。

所以ASM.js只适合针对一些数做特别复杂的计算的场景。

常见示例代码如下图(https://github.com/dherman/asm.js):
http://s3/mw690/001B6Jtvzy7dexVSseea2&690Asm.js" TITLE="传说中的JS神器 Asm.js" />

一些相关资源:
Asm.js官方网站:http://asmjs.org/
代码示例:https://github.com/dherman/asm.js
给人阅读的规范:https://github.com/zbjornson/human-asmjs

最后实在忍不住吐槽一句,官方的规范和文档实在是惨不忍睹,没必要的就不要去找恶心了。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有