在假设“非常好”意味着最小化浮点算术运算量以支持整数算术的假设下,有些算法“非常好”地解决了问题。以Bresenham 的线条算法为例,该算法用于确定要填充哪些像素以便在画布上绘制线条:这个人实际上只用一些简单的整数运算就可以完成整个过程。
这种事情在很多情况下显然是好的。但是,在 javascript 中需要大量浮点数学运算的操作值得烦恼吗?据我所知,就语言规范而言,一切几乎都是十进制数。我想知道尝试将事物尽可能保持为整数是否值得 - 浏览器是否进行了可以使其值得的优化?
在假设“非常好”意味着最小化浮点算术运算量以支持整数算术的假设下,有些算法“非常好”地解决了问题。以Bresenham 的线条算法为例,该算法用于确定要填充哪些像素以便在画布上绘制线条:这个人实际上只用一些简单的整数运算就可以完成整个过程。
这种事情在很多情况下显然是好的。但是,在 javascript 中需要大量浮点数学运算的操作值得烦恼吗?据我所知,就语言规范而言,一切几乎都是十进制数。我想知道尝试将事物尽可能保持为整数是否值得 - 浏览器是否进行了可以使其值得的优化?
您可以在 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 中执行此操作。
很久以前,计算机缺乏专用的 FPU,并且完全通过软件仿真来进行浮点数学运算。
现代计算机都有专门的 FPU 来处理浮点数学和整数。除非您有非常具体的情况,否则您无需担心。
实际上,它并没有什么不同。JavaScript 没有“整数”的概念。JS 只使用双精度浮点数,它可能是也可能不是整数。
因此,将自己限制为整数绝对不会在性能方面获得任何好处。
但是,请记住,整数将精确到 2 51,而非整数很容易遭受精度损失(例如:0.1),因此您可能会因此而受益。