2013-04-30 44 views
4

算法與double如何與int值相比較?有很大的區別,還是可以忽略?算法速度與雙和int?

在我的情況,我有一個畫布,使用Integers到目前爲止。但是現在,隨着我實施縮放,我可能會將所有內容切換到Double。這會對計算產生重大影響嗎? 如果是這樣,那麼可能會舍入一倍,只有幾個分數優化性能?

還是我完全在過度優化的道路上,應該只使用雙打而沒有任何頭痛?

+0

由於許多算法仍然要寫,儘管在一般情況下使用double而不是整數的影響,但他對此感興趣。 – membersound 2013-04-30 11:11:24

+1

取決於你在做什麼。最好的事情是測試兩種方式並進行比較。 – Bohemian 2013-04-30 11:12:45

+0

使用double創建並使用'System.currentTimeMillis()'檢查時間並檢查兩者的性能 – asifsid88 2013-04-30 11:15:24

回答

6

你在GWT中,所以最終你的代碼將是JavaScript,並且JavaScript有一個數字數據類型:Number,這對應於Java的Double

在GWT使用整數可以意味着(我不知道GWT編譯器究竟做,它也可能是依賴於上下文,如雜交JSNI邊界),生成的代碼做比雙打工作(將數字轉換爲整數值),或者代碼根本不會改變。總而言之,期望使用雙打的性能相同或稍好一點(除非您稍後必須對整數進行轉換)。但一般來說你是過度優化(還有:優化需要度量/度量;如果你沒有它們,那麼你就處於「不成熟優化」路徑)

4

整數和雙打之間有相當大的差異,但通常雙打也是非常快的。

不同之處在於整數仍然比雙精度要快,因爲對整數進行算術運算只需要很少的時鐘週期。

雙倍速度也很快,因爲它們通常由浮點單元本地支持,這意味着它是由專用硬件計算的。不幸的是,它通常是2倍到40倍慢。

話雖如此,CPU通常會花費相當多的時間在循環和函數調用等內務處理上,所以如果速度足夠快,整數大部分時間(甚至99%的時間)雙打速度會很快。

浮點數的速度慢幾個數量級是唯一的時候必須被模擬,因爲沒有硬件支持。這通常只發生在嵌入式平臺上,或者使用非常見的浮點類型(例如128位浮點數或十進制浮點數)。

一些基準的結果,可以發現:

但通常,

  • 32位平臺具有雙打之間的較大差異和整數
  • 整數總是至少快兩倍的加法和減法
2

如果你要改變的整數型在程序中增加一倍,你還必須能夠重寫比較兩個整數的這些代碼行。就像a和b是兩個整數,如果(a == b)改變a,b類型加倍,你也必須改變這一行,並且必須使用double的比較方法。

0

一般來說,數學自然適合整數將比自然適合作爲雙數的數學更快,但試圖強制雙數學運算作爲整數幾乎總是更慢,在兩個成本之間來回移動更多比你獲得的速度提升。

如果你正在考慮類似:

我只希望我的「自動準整數浮動」所以我只是乘以10的一切在1位小數;

5.5 * 6.5

so 5.5 --> 55 and 
so 6.5 --> 65 

具有特殊倍增功能

public int specialIntegerMultiply(int a, int b){ 
    return a*b/10; 
} 

那麼對於上帝的愛不,它很可能會更慢了所有的額外開銷和它」寫會讓人感到困惑。

p.s.四捨五入的雙打將毫無意義,因爲剩餘的小數位仍然存在,它們將全部爲0(十進制,即二進制,甚至不會是真的)。

1

不知道你的程序確切的需求,我的直覺是你過度優化。在使用整數或雙精度進行選擇時,通常基於哪種類型的值需要哪個值運行得更快。如果您需要允許(不一定是精確的)十進制值的浮點值,請選擇雙精度值。如果您需要精確的整數值,請輸入整數。

一對夫婦更點:

四捨五入的雙打,以一定的分數應該不會對性能沒有影響。事實上,擺在首位的費用可能會產生負面影響。

雖然我會爭論不要擔心int和double之間的性能差異,但int和Integer之間存在顯着差異。雖然int是一種可以高效使用的基本數據類型,但Integer是一個基本上只包含int的對象。這招致了巨大的開銷。整數是有用的,因爲它們可以存儲在像Vectors這樣的集合中,而整數不能,但在所有其他情況下,它最好使用整數。