1必备知识
1.1什么是asm.js
asm.js是一种JavaScript加速技术,由网络浏览器供应商Mozilla提出,并在该组织提供的Firefox中实现。其他浏览器供应商在确认其有效性后采用了此技术,现在是Chrome它也可以与Edge之类的浏览器一起使用。
1.2asm.js诞生的背景
HTML5已被公众使用,并且WEB应用程序变得越来越复杂,但是另一方面,突出了HTML固有的性能问题,最初,WEB浏览器是基于简短的HTML文档。运行在其上的脚本也非常有限,换句话说,JavaScript是立即编写并立即移动的,其性能不是问题。但是,从HTML5规范的复杂性可以看出,最近需要与本机应用程序等效的功能,例如音频和视频处理,因此,不可避免的是,原本不是为高性能而设计的JavaScript部分是必需的。在操作速度方面已经变得次等。
最初希望通过改善JavaScript解释器(JIT编译)的功能和硬件环境的发展来自然解决该问题,但实际上,平板电脑终端和智能手机的环境不如PC强大。结果,不再可能离开。
为什么JavaScript这么慢?原因之一是动态类型,从人的角度来看,很高兴看到您不必考虑与要实现的处理没有直接关系的类型。每次处理时都需要计算(类型确定),另一方面,除非有特殊情况,否则变量将以有限的方式使用,并且处理数值的变量将数值存储到最后。换句话说,即使已知预先将其作为数值处理,也别无选择,只能执行称为类型确定的额外处理。它对您说的话有很大的影响。
作为对策,首先,诞生了一种用于有效处理二进制数据的对象,即类型数组,但仅靠它本身并不能提供根本的解决方案。这个想法是``我们可以做类型声明吗?’'如果可以进行静态类型化,则解释器应该能够更有效地解析并提高脚本处理速度。
因此asm.js诞生了。Asm.js推出数字型,原本是不可能在JavaScript中的概念,它已经成功地给翻译时进行处理的提示。
Hint:asm.js中的“ asm”可能源自汇编程序或汇编程序,顺便说一句,原始JavaScript可以在网络世界中表达为汇编语言。
Hint:除了asm.js之外,还有其他一些技术正在寻求提高Web应用程序的性能,例如Google的PNaCl。它旨在在(字节码)的浏览器环境中执行。
1.3 asm.js的功能
以下总结了asm.js的功能
JavaScript是,子集
是由JavaScript的语法加约束得到Asm.js,是在不支持asm.js的环境表现为一个正常的JavaScript代码。其结果是,在asm.js没有意识到工作环境另外,该特征具有优点和缺点。
用asm.js编写的代码被预编译并缓存在内存中,
JavaScript代码在概念上被解释为在运行时,但是asm.js代码在解析时被预编译。可以通过调试工具确认编译的成功与否。
asm.js是专门用于数值运算的环境,
因此无法执行UI处理(例如事件),而且许多JavaScript函数和对象(甚至是Array)都直接来自于asm.js代码。请注意,可以从asm.js调用外部处理。
asm.js中没有数据结构概念,
数组,结构和对象之类的数据结构无法在asm.js中使用,因此,复杂的处理被分解为简单的代码。自然地,该描述倾向于扩大。
与普通的JavaScript代码相比,可以获得更好的处理性能,并且
由于它是低功能(低阶)的,因此据说与一般的本机代码相比,可以获得大约60%至70%的性能。
Asm.js代码可以从其他语言输出,
实际上,这是最重要的功能,并且可以将以C / C ++等语言编写的处理机械地转换为asm.js代码。由于不再需要直接操作语法(根据),因此可以高效地执行程序开发。
Asm.js不会以这种方式替换现有的JavaScript代码,而 Asm.js是使其他语言(例如C和C ++)的JavaScript输出有效工作的方法。它源于此想法,并已在Web浏览器方面作为附加功能进行开发,因此,asm.js代码必须是相对底层的内容(对于计算机),并且应具有可读性效率被牺牲了,因此它是不知道内容的很好的替代品,但是如果您了解操作原理,则可以更轻松地预测使用asm.js可以做什么。
从不同的角度来看,asm.js 可以称为由JavaScript组成的C / C ++虚拟机。
手工汇编的asm.js代码的功能
以上是asm.js的一般理论,盲目采用asm.js是一个快速的主意,当手工处理asm.js时,请注意以下几点:应该是。
面向对象的方法
行不通,因为使程序更容易使用的技巧根本行不通,因此,从算法抽象和处理结构方面质疑程序员的实力。这是非常困难的。
视处理内容而定,效果不大,
自动输出的asm.js代码通过预付预编译成本来减轻脚本执行的负担,而且,asm.js模块调用比常规函数调用更多结果,倾向于较小的asm.js代码(在管理操作方面)的特性可能会变得很麻烦,从而可能会对运行速度产生不利影响。为了从.js中受益,可以说代码大小是合理的(在某种程度上,隐式成本的增加并不令人担忧)。
支持Asm.js的代码本质上是快速的,
可以使用asm.js编译的代码专门用于数值运算,因此易于优化,即使在正常的JavaScript环境中也可以高速运行。换句话说,您可能会获得足够的性能而无需强制启用asm.js(以预编译为代价)(但不如asm.js那样多)†。
†实际上,我遇到了在我的环境中禁用asm.js更快的情况,从某些方面来看,艰辛的回报较少。
由此,除了“使用”和“不使用” asm.js之外,您还可以获得“ 根据asm.js的语法不使用asm.js ”的第三个选项。使用js作为在本地进行优化的编码标准,在手工编写脚本代码时丢弃JavaScript提供的有用对象是不切实际的。调整是否要安装.js非常重要。
asm.js系统要求
asm.js目前可在Firefox,Chrome,Edge,Opera和Safari †浏览器中运行,因此,在大多数浏览器环境中,asm.js代码都可以高速执行,此外,Node.JS等也可以执行。在某些JavaScript执行环境中还支持Asm.js。
†Safari具有与asm.js等效的JavaScript加速/优化技术,因此您可以说可以使用asm.js,类似地,Chrome / Edge的标称是asm.js。但是,不能保证内部实现与Firefox相同,从上面可以优化“ asm.js”代码(按语法)有对于每个浏览器不同。例如,即使不符合100%至asm.js一个代码部分的操作速度提高存在这样的情况。
检查asm.js的操作
无法直接从Web浏览器的屏幕上检查asm.js的操作,您将使用浏览器内置的开发工具(主要是Firefox)进行检查。
asm.js的未来
Asm.js是以这种方式诞生的,但是随着引入数量的增加,新的问题变得很明显,尽管它确实有助于提高脚本操作速度,但为此付出了代价,即脚本加载为了与JavaScript代码兼容,asm.js代码完全以文本形式编写,通常,字符数据小于二进制数据(即使已压缩)。结果,机械输出脚本的大小通常为几十兆字节,特别是对于需要大量操作的3D视频处理和游戏。花费的时间和解析成本不可忽略。
Asm.js代码传输就像每次都从源代码生成可执行文件一样,因此,如果您可以分发已保证可以用作程序代码的二进制数据,则可以解决此问题。另外,可以期望二进制数据具有较高的压缩效率,因此,WebAssembly正在考虑中,可以在Web浏览器中通过专用编译器(所谓的编译器)从诸如C或C ++的语言执行二进制程序。如果网络浏览器已准备就绪,则Asm.js模块)将是一个不错的选择。
当前需要JavaScript才能使用WebAssembly来获取和调用模块,并且站立位置与asm.js完全相同,也就是说,使用asm.js无法完成的工作无法通过WebAssembly完成。
然后,将再次询问存在asm.js的重要性,但是由于它已经在提高JavaScript解释器的运行速度方面发挥了一定作用,因此毫无疑问,它将在未来继续成为一项重要技术。另外,就我个人而言,我认为它可以成为研究的课题,因为它可以加快甚至小的手写脚本的速度,因此,它甚至支持鲁棒的手写asm.js尝试。如果可能……这是创建此文档的动机。
什么时候应该安装asm.js?
现在,我们发现asm.js可以极大地提高Web应用程序的性能,在什么情况下应该引入asm.js?
如果您从一开始就知道要进行“繁重”的处理,那就是您知道
在构建应用程序之前将进行复杂的处理(游戏和视频处理)。对于是否应使用js,需要进行仔细的设计。
创建(或移植)通用算术
模块时,如果您已经知道计算目标的算法特征并将其部署在JavaScript上,则Asm.js是一个强大的选项。如果更改的频率很小,那么即使牺牲了一些可读性也不会有影响,当然,在进行全面测试之后。
如果计算目标没有特定的数据结构,
但是原始设计取决于该数据结构,则将很难移植到asm.js(需要进行详细的设计工作)。如果这只是一个数值计算,则很可能您可以移至asm.js。
如果您的环境可以自动输出
asm.js代码,则手动编写asm.js代码是一项艰巨的任务。因此,如果您可以机械地输出代码(换句话说,如果您具有Emscripten环境,则存在用C等编写的代码资产(如果可以编码),则应积极使用它。
作为性能调整的最后手段,
如果您执行通用JavaScript优化并且性能仍然很差,请在您认为有问题的地方部分替换asm.js(例如,以下内容)是的
进行复杂繁琐计算的位置
示例)矩阵运算,数值统计,复利计算,贝塞尔曲线的坐标计算…
简单但重复的计算†
示例)动画的坐标计算,鼠标坐标的转换…
†但是,在考虑I / O负载时,效果似乎受到限制。
但是,这项工作应该由在某种程度上熟悉JavaScript的成员来完成,即使以静默方式引入它,现有代码也将受到破坏,并且将创建无法维护的代码,并且还对性能进行了测量并引入了asm.js。如前所述,手工组装的asm.js代码可能适得其反。
无论如何,它都不应该依赖黑暗,可以这么说,asm.js可以称为JavaScript世界的黑魔法。如果您不过度使用它,您将负担沉重,即使您不采用asm.js,JavaScript的API也在逐年发展,即使您适当地选择了对象方法,也可以看到性能的充分改善。但是,在某些情况下,即使您稍作更改,只要更改循环计数器等,您就可以获得显着的效果,并且完全可以想象,源自asm.js的新JavaScript编码标准将会渗透进来。 。