当前位置: 首页 > 科技观察

Asm.js性能接近原生代码

时间:2023-03-14 16:43:52 科技观察

Asm.js是JavaScript的高性能子集,具有简化的功能,易于优化。Mozilla现在宣布asm.js的性能更接近原生,asm.js的速度已经达到原生代码的2/3,而之前只能达到1/2甚至更低。Mozilla正在通过改变浮点运算的处理方式来提高asm.js的性能。JavaScript默认使用float64数据类型提供最高的数据精度,但是相对于较小的int、int32、float和float32数据类型,float64的效率并不高,Mozilla的SpiderMonkey引擎在asm.js中加入了float32增加数据类型,可以将C/C++程序中的float32算法直接翻译成asm.js的float32算法。Mozilla认为asm.js的性能可以进一步提高。asm.js是针对JavaScript的一个子集特别优化的低级编译器。这是Mozilla研究项目,类似于Emscripten、Mandreel和LLJS。示例代码:functionmymodule(global,foreign,buffer){"useasm";//-----------------------------------------------------------------------//SECTION1:importsvarH32=newglobal.Int32Array(buffer);varHU32=newglobal.Uint32Array(buffer);varlog=foreign.consoleDotLog;//--------------------------------------------------------------------//SECTION2:functionsfunctionf(x,y,z,w){//SECTIONA:parametertypedeclarationsx=x|0;//intparametery=+y;//doubleparameter//SECTIONB:functionbodylog(x|0);//callintoFFI--mustforcethesignlog(y);//callintoFFI--alreadyknowit'sadoublex=(x+3)|0;//signedaddition//SECTIONC:unconditionalreturnreturn((((x+1)|0)>>>0)/(x|0))>>>0;//复合表达式}functiong(){g_f=+g_i;//读/写globalsreturn;}functiong2(){return;}functionh(i,x){i=i|0;x=x|0;H32[(i&0xffffffff)>>4]=x;//maskedby2^k-1,shiftedbybytecountftable_2[(x-2)&2]();//dynamiccalofffunctionsintable2}//--------------------------------------------------------------------//SECTION3:functiontablesvarftable_1=[f];varftable_2=[g,g2];//allofthesametype//--------------------------------------------------------------------//SECTION4:globalsvarg_i=0;//intglobalvarg_f=0.0;//doubleglobal//--------------------------------------------------------------------//SECTION5:exportsreturn{f_export:f,goop:g};}原链接:http://www.solidot.org/story?sid=37740