Mozilla优化asm.js:代码性能接近原生应用
程序员文章站
2022-05-07 12:10:07
...
asm.js是Mozilla在2013年年初推出的一个JavaScript的严格子集,它提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等。
asm.js可以被用来作为一个底层的、高效的编译器目标语言,即可以将C/C++程序通过Emscripten编译为asm.js代码,以提升程序的执行速度。如果使用Mozilla专门为asm.js开发的优化模块OdinMonkey,则会进一步提升速度,更加接近于原生应用。
在今年年初asm.js推出时,其代码的运行速度大约为原生应用的一半。在此之后,Mozilla进行了诸多实验和优化,有小方面的优化,也有大方面的改进,比如在Firefox中可以使用32位浮点数来代替64位双精度数,这在某些情况下可以得到更快的速度。
目前Mozilla已经在Emscripten和SpiderMonkey(Firefox的JS引擎)中完成了该工作,下面是基准测试结果对比。
红色条(firefox-f32)表示通过启用float32的Emscripten生成的代码的运行速度,可以发现,相比未启用float32特性的运行速度有了一定的提升。而用来进行对比的原生应用编译器有两个——clang和gcc,这两个编译器编译后的原生代码在性能上也有所差异。
需要注意的是,在Emscripten中,float32代码生成选项默认是关闭的。这是因为float32尽管能够提升性能,但是也会增加代码量(比如添加Math.fround调用),这在某些情况下是有害的,尤其是在JS引擎尚未支持Math.fround的情况下。
Web应用自诞生以来,其与原生应用之争就一直存在,而HTML5阵营的诸多开发者的工作正使得Web应用的性能越来越接近于原生应用,这对于HTML5未来的发展是极大地利好。
Via mozilla
asm.js可以被用来作为一个底层的、高效的编译器目标语言,即可以将C/C++程序通过Emscripten编译为asm.js代码,以提升程序的执行速度。如果使用Mozilla专门为asm.js开发的优化模块OdinMonkey,则会进一步提升速度,更加接近于原生应用。
在今年年初asm.js推出时,其代码的运行速度大约为原生应用的一半。在此之后,Mozilla进行了诸多实验和优化,有小方面的优化,也有大方面的改进,比如在Firefox中可以使用32位浮点数来代替64位双精度数,这在某些情况下可以得到更快的速度。
目前Mozilla已经在Emscripten和SpiderMonkey(Firefox的JS引擎)中完成了该工作,下面是基准测试结果对比。
红色条(firefox-f32)表示通过启用float32的Emscripten生成的代码的运行速度,可以发现,相比未启用float32特性的运行速度有了一定的提升。而用来进行对比的原生应用编译器有两个——clang和gcc,这两个编译器编译后的原生代码在性能上也有所差异。
需要注意的是,在Emscripten中,float32代码生成选项默认是关闭的。这是因为float32尽管能够提升性能,但是也会增加代码量(比如添加Math.fround调用),这在某些情况下是有害的,尤其是在JS引擎尚未支持Math.fround的情况下。
Web应用自诞生以来,其与原生应用之争就一直存在,而HTML5阵营的诸多开发者的工作正使得Web应用的性能越来越接近于原生应用,这对于HTML5未来的发展是极大地利好。
Via mozilla