2012-12-29 26 views
4

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

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

+0

尽可能简单,然后如果需要尝试优化 – dchhetri

+1

我无法想象一个Web应用程序,其中CPU时间甚至接近网络时间。 – stark

+0

@stark,客户端音频处理将是一种情况......尽管这是一个有争议的问题,因为JavaScript不支持他所谈论的内容。 – Brad

回答

-1

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

因此,通过将自己限制为整数,在性能方面绝对没有任何好处。

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

+8

V8(也可能是其他JavaScript引擎)[带有类型的标记值,包括31位有符号整数](http://www.html5rocks.com/en/tutorials/speed/v8/)。如果你发现你需要提高性能,使用所有整数可能会有所帮助。 – Jim

+3

降低维修成本。吉姆是对的。现代JavaScript绝对有一个整数的概念,即使它没有一个字。 – mako

+0

我不知道他们是否在你的一天有这个,但在我的,有'Number.MAX_SAFE_INTEGER'。 –

3

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

现代计算机都有专用的FPU,可以处理浮点数学和整数。除非你有特殊的情况,否则你不应该担心。

+0

“处理浮点数学和整数” - 是否需要相同数量的计算能力才能进行双精度浮点除法,因为它将在现代CPU上进行整数除法? – Robz

+0

让我们不要迂腐。一般来说,对于同等大小的寄存器,FPU的浮点运算与ALU执行整数运算一样快。司可能是一个例外。对于加法,减法和乘法,FPU的火箭速度很快,并且可以轻松地匹配ALU。 (地狱,浮点乘法比整数乘法简单。) – StilesCrisis

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中完成此操作。

+0

“这是真正的整数算术”→这是误导!如果你使用乘法,你会看到两个不同的情况;他们*正在经历一个浮点中间。 – Veedrac