2012-12-29 27 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