9

在假设“非常好”意味着最小化浮点算术运算量以支持整数算术的假设下,有些算法“非常好”地解决了问题。以Bresenham 的线条算法为例,该算法用于确定要填充哪些像素以便在画布上绘制线条:这个人实际上只用一些简单的整数运算就可以完成整个过程。

这种事情在很多情况下显然是好的。但是,在 javascript 中需要大量浮点数学运算的操作值得烦恼吗?据我所知,就语言规范而言,一切几乎都是十进制数。我想知道尝试将事物尽可能保持为整数是否值得 - 浏览器是否进行了可以使其值得的优化?

4

3 回答 3

15

您可以在 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]; 

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

附带说明*,如果您的程序可以执行 SIMD 并行性(参见 wikipeda),即如果您的代码使用 SSEx 指令集,您的算术将快得多,实际上使用 int8s 的速度将是使用 int16s 等的两倍。

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

于 2013-05-26T21:43:45.780 回答
4

很久以前,计算机缺乏专用的 FPU,并且完全通过软件仿真来进行浮点数学运算。

现代计算机都有专门的 FPU 来处理浮点数学和整数。除非您有非常具体的情况,否则您无需担心。

于 2012-12-29T04:29:31.643 回答
-5

实际上,它并没有什么不同。JavaScript 没有“整数”的概念。JS 只使用双精度浮点数,它可能是也可能不是整数。

因此,将自己限制为整数绝对不会在性能方面获得任何好处。

但是,请记住,整数将精确到 2 51,而非整数很容易遭受精度损失(例如:0.1),因此您可能会因此而受益。

于 2012-12-29T04:28:37.917 回答