[英]Java Double vs double: class type vs primitive type
我很好奇Java的類和double的原始類型之間的性能差異。 所以我創建了一個小基准測試,發現類類型比基本類型慢3x-7x。 (在本地機器OSX上為3倍,在ideone上為7倍)
這是測試:
class Main {
public static void main(String args[]) {
long bigDTime, littleDTime;
{
long start = System.nanoTime();
Double d = 0.0;
for (Double i = 0.0; i < 1432143.341; i += 0.1) {
d += i;
}
long end = System.nanoTime();
bigDTime = end - start;
System.out.println(bigDTime);
}
{
long start = System.nanoTime();
double d = 0.0;
for (double i = 0.0; i < 1432143.341; i += 0.1) {
d += i;
}
long end = System.nanoTime();
littleDTime = end - start;
System.out.println(littleDTime);
}
System.out.println("D/d = " + (bigDTime / littleDTime));
}
}
那么為什么Double類型這么慢? 為什么甚至實現允許數學運算符?
那么為什么Double類型這么慢?
因為該值包含在需要分配,釋放,內存管理以及getter和setter的對象中
為什么甚至實現允許數學運算符?
因為autobox旨在允許你使用這樣的包裝器而不用擔心它們不是普通的值。 你不希望沒有ArrayList<Double>
嗎? 性能並不總是必要的,根據情況可以接受3x-7x的性能下降。 優化是一種並非始終存在的要求。
在每種情況下都是如此,使用LinkedList
到隨機訪問元素可能有點過分但這並不意味着根本不應該實現LinkedList
。 這並不意味着使用鏈接列表進行少量隨機訪問可能會對性能造成太大影響。
最后一點 :在對這些事情進行基准測試之前,你應該讓VM熱身。
你通常不會使用Double
, Integer
等(偶爾Integer
等可以用於存儲'可選'值 - 你有時可能希望它為null
。這對於Double
來說是不太可能的,因為NaN
可用於那些。 )
Double
存在的原因如下。 Java有兩種主要類型的值:對象(基本上類似於沒有算術的C / C ++指針)和原始值(例如double
)。 像ArrayList
這樣的類可以被定義為接受任何Object
,它允許用戶將String
, File
或任何他們喜歡的東西存儲在一個中 - 但是這樣的定義不包括像double
這樣的原始值。 所以像Double
這樣的類存在使得像ArrayList
這樣的類更容易存儲double
,而不需要ArrayList
的作者為所有基本類型創建特殊版本。
Double
是盒裝double
。 因此,一般來說,編譯后的代碼必須在使用它之前檢查Double
for null。 這當然比什么都不做要慢。
Double
(和其他盒裝版本的基元)很有用,因為它是一個Object
。 這允許您將其傳遞給將接受Object
函數,並將其強制轉換為其他位置的Double
。 更有用的是,它允許泛型類型包含它:泛型類型不能包含double
或任何其他原語,但它可以包含Double
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.