优化javascript代码以使用整数运算

Rob*_*obz 5 javascript floating-point integer-arithmetic

有一些算法可以"很好地"解决问题,假设"非常好"意味着最小化浮点算术运算的数量,有利于整数运算.以Bresenham的线算法为例,找出要填充的像素,以便在画布上绘制一条线:这个人实际上只用一些简单的整数算法就可以完成整个过程.

在许多情况下,这种事情显然都很好.但是,在javascript中需要大量浮点数学的操作是否值得烦恼?据我所知,就语言规范而言,一切都是十进制数.我想知道,如果它是实际上值得尽量保持事情的整数样地-做浏览器进行优化,可以使这值得吗?

dan*_*man 9

您可以在javascript中使用Int8,Uint8,Int16等,但它需要比平常更多的努力 - 请参阅TypedArrays.

var A = new Uint32Array(new ArrayBuffer(4*n));
var B = new Uint32Array(new ArrayBuffer(4*n));

//assign some example values to A
for(var i=0;i<n;i++)
  A[i] = i; //note RHS is implicitly converted to uint32

//assign some example values to B
for(var i=0;i<n;i++)
  B[i] = 4*i+3;  //again, note RHS is implicitly converted to uint32   

//this is true integer arithmetic
for(var i=0;i<n;i++)
  A[i] += B[i]; 
Run Code Online (Sandbox Code Playgroud)

最近,asm.js项目使得有可能将C/C++代码编译成奇怪的javascript,它以相当极端的方式使用这些TypedArrays,这样做的好处是你可以使用现有的C/C++代码并且它应该运行得很漂亮在浏览器中快速(特别是如果浏览器供应商对这种代码实现特殊优化,这应该很快就会发生).

在旁注*如果您的程序可以执行SIMD并行(请参阅wikipeda),即如果您的代码使用SSEx指令集,您的算法将更快,并且事实上使用int8s将是使用int16s等的两倍.

*我认为这与浏览器无关,因为它们太难以在飞行中利用它们.编辑:事实证明Firefox正在尝试这种优化.此外,Dart(真正的Dart,而不是Dart编译为js)将能够在Chrome中执行此操作.