有一些算法可以“很好地”解决问题,假设“非常好”意味着最小化浮点算术运算的数量,有利于整数运算。以Bresenham's line algorithm为例来确定要填充哪些像素以便在画布上画一条线:这个人实际上只用一些简单的整数算法就可以完成整个过程。
在许多情况下,这种事情显然很好。但是,在javascript中需要大量浮点数学的操作是否值得烦恼?据我所知,就语言规范而言,一切都是十进制数。我想知道是否几乎值得尝试保持尽可能整数的东西 - 浏览器是否进行优化以使其值得?
答案 0 :(得分:8)
您可以在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 ++代码编译为以相当极端的方式使用这些TypedArrays的奇怪的javascript,好处是您可以使用现有的C / C ++代码它应该在浏览器中运行得非常快(特别是如果浏览器供应商为这种代码实现特殊的优化,这应该很快就会发生)。
旁注*如果你的程序可以做SIMD并行(参见wikipeda),即如果你的代码使用SSEx指令集,你的算法会快得多,实际上使用int8s的速度是使用int16s的两倍等
*我认为这与浏览器无关,因为它们太难以在飞行中利用它们。 编辑:事实证明,Firefox正在尝试这种优化。此外,Dart(真正的Dart,而不是Dart编译为js)将能够在Chrome中执行此操作。
答案 1 :(得分:3)
很久以前,计算机缺少专用的FPU,完全通过软件仿真进行浮点计算。
现代计算机都有专用的FPU,它们处理浮点数学和整数。除非你有特殊的情况,否则你不必担心它。
答案 2 :(得分:-1)
实际上,它没有什么不同。 JavaScript没有“整数”的概念。 JS只使用双精度浮点数,可能是也可能不是整数。
因此,通过将自己限制为整数,在性能方面绝对没有任何好处。
但是,请记住,整数将精确到2 51 ,而非整数很容易遭受精度损失(例如:0.1),因此您可能会因此而获益。