算法與double
如何與int
值相比較?有很大的區別,還是可以忽略?算法速度與雙和int?
在我的情況,我有一個畫布,使用Integers
到目前爲止。但是現在,隨着我實施縮放,我可能會將所有內容切換到Double
。這會對計算產生重大影響嗎? 如果是這樣,那麼可能會舍入一倍,只有幾個分數優化性能?
還是我完全在過度優化的道路上,應該只使用雙打而沒有任何頭痛?
算法與double
如何與int
值相比較?有很大的區別,還是可以忽略?算法速度與雙和int?
在我的情況,我有一個畫布,使用Integers
到目前爲止。但是現在,隨着我實施縮放,我可能會將所有內容切換到Double
。這會對計算產生重大影響嗎? 如果是這樣,那麼可能會舍入一倍,只有幾個分數優化性能?
還是我完全在過度優化的道路上,應該只使用雙打而沒有任何頭痛?
你在GWT中,所以最終你的代碼將是JavaScript,並且JavaScript有一個數字數據類型:Number
,這對應於Java的Double
。
在GWT使用整數可以意味着(我不知道GWT編譯器究竟做,它也可能是依賴於上下文,如雜交JSNI邊界),生成的代碼做比雙打更工作(將數字轉換爲整數值),或者代碼根本不會改變。總而言之,期望使用雙打的性能相同或稍好一點(除非您稍後必須對整數進行轉換)。但一般來說你是過度優化(還有:優化需要度量/度量;如果你沒有它們,那麼你就處於「不成熟優化」路徑)
整數和雙打之間有相當大的差異,但通常雙打也是非常快的。
不同之處在於整數仍然比雙精度要快,因爲對整數進行算術運算只需要很少的時鐘週期。
雙倍速度也很快,因爲它們通常由浮點單元本地支持,這意味着它是由專用硬件計算的。不幸的是,它通常是2倍到40倍慢。
話雖如此,CPU通常會花費相當多的時間在循環和函數調用等內務處理上,所以如果速度足夠快,整數大部分時間(甚至99%的時間)雙打速度會很快。
浮點數的速度慢幾個數量級是唯一的時候必須被模擬,因爲沒有硬件支持。這通常只發生在嵌入式平臺上,或者使用非常見的浮點類型(例如128位浮點數或十進制浮點數)。
一些基準的結果,可以發現:
但通常,
如果你要改變的整數型在程序中增加一倍,你還必須能夠重寫比較兩個整數的這些代碼行。就像a和b是兩個整數,如果(a == b)改變a,b類型加倍,你也必須改變這一行,並且必須使用double的比較方法。
一般來說,數學自然適合整數將比自然適合作爲雙數的數學更快,但試圖強制雙數學運算作爲整數幾乎總是更慢,在兩個成本之間來回移動更多比你獲得的速度提升。
如果你正在考慮類似:
我只希望我的「自動準整數浮動」所以我只是乘以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(十進制,即二進制,甚至不會是真的)。
不知道你的程序確切的需求,我的直覺是你過度優化。在使用整數或雙精度進行選擇時,通常基於哪種類型的值需要哪個值運行得更快。如果您需要允許(不一定是精確的)十進制值的浮點值,請選擇雙精度值。如果您需要精確的整數值,請輸入整數。
一對夫婦更點:
四捨五入的雙打,以一定的分數應該不會對性能沒有影響。事實上,擺在首位的費用可能會產生負面影響。
雖然我會爭論不要擔心int和double之間的性能差異,但int和Integer之間存在顯着差異。雖然int是一種可以高效使用的基本數據類型,但Integer是一個基本上只包含int的對象。這招致了巨大的開銷。整數是有用的,因爲它們可以存儲在像Vectors這樣的集合中,而整數不能,但在所有其他情況下,它最好使用整數。
由於許多算法仍然要寫,儘管在一般情況下使用double而不是整數的影響,但他對此感興趣。 – membersound 2013-04-30 11:11:24
取決於你在做什麼。最好的事情是測試兩種方式並進行比較。 – Bohemian 2013-04-30 11:12:45
使用double創建並使用'System.currentTimeMillis()'檢查時間並檢查兩者的性能 – asifsid88 2013-04-30 11:15:24