2011-04-14 22 views
2

我的問題是: 如果我猜中了從Java拆卸,當我使用點字節和短在Java中的(我讀過的其他問題)

byte a=3,b=5; 
System.out.println(a+b); 

實際上使用int,而不是字節。所有本地內存插槽都是4B插槽。我意識到分配一個字節數組可能會更高效,但是使用單個字節值最終效率低下是真的嗎? (簡稱同一點)

+3

我的建議:當你需要處理* bytes *時使用字節。當你需要處理*數字*時使用int。他們不完全一樣。 – 2011-04-14 11:47:21

回答

1

性能調整的第一條規則應該是寫簡單明瞭的代碼。

在這個例子中,沒有任何性能差異,即使有println()需要10,000倍的時間纔會產生任何區別。


程序如何顯示在字節碼中,以及它在本機代碼中的顯示方式有所不同。

並非所有插槽在JVM中都是4字節。例如在64位機器上的引用可以是8字節,但仍然使用一個「插槽」

您的機器沒有插槽。它的寄存器通常是32位或64位。

在你的例子中,使用了字節操作,它與int操作一樣有效,並且可以產生不同的結果,所以它們仍然是必需的。

注意:byteshort字段的對象可以小於具有int字段的對象。

在這個例子中,JVM可以計算c一次,以便它不需要ab

+0

所以基本上,儘管在64位機器int(作爲Java變量)將是4B並且指針/引用將是8B,VM將它們視爲原子局部變量。它是否正確? – 2011-04-14 12:08:42

+0

@George Penn,正確。但是,如果在64位JVM上使用「-XX:+ UseCompressedOops」,引用將是4字節而不是8字節。 ;) – 2011-04-14 12:22:25

2

+是整數運算。這就是爲什麼

byte c = a+b; // compile error 

你應該使用

int c = a + b 

byte c = (byte)(a+b); 

我的建議是爲了不投每次使用int。如果你總是處理byte使用字節,否則使用int

+0

我的意思是System.out.println(a + b); – 2011-04-14 11:50:16

0

聲明byte a=3,b=5;作爲final byte a=3,b=5;這樣,當本聲明byte c = a+b;將得到執行,將採取byteint

+0

我很確定JVM可以以任何方式工作。 ;) – 2011-04-14 11:54:35

2

重要的是要認識到,在Java中,byteshort的存在主要不是具有較小範圍的整數數據類型。幾乎在所有情況下(數值足夠小)的數值將被使用,即使有效範圍僅爲0-100,也會使用int

byteshort用於某些外部因素將要處理的數據限制爲這些範圍。它們只是爲了簡化與這些系統的交互而存在。

例如,現在的文件系統存儲字節流。您可以使用對所有這些讀/寫操作使用int,但是具有byte數據類型可簡化操作並明確區分。

0

定義效率低下。

是的,內存佔用可能看起來效率低下,但請記住今天大多數處理器是32位(甚至64位)。只有8位存儲一個字節需要處理器獲得32位地址空間並進行移位和清理,因此必要的8位位於正確的位置。

+0

低效的意思是int將爲: a)更快 b)更大的用途 c)相同的內存佔用 謝謝 – 2011-04-14 11:58:50