2011-12-02 53 views
1

說我有一個Java程序,例如:影響計算時間的值的大小?

//case1 
Long first = 1; 
Long second = 1; 
Long third = first - second; 

//case2 
Long first = Long.MAX_VALUE; 
Long second = 100000L; 
Long third = first - second; 

這兩個病例應具有完全相同的執行時間和開銷應該不是嗎?實際的操作是在右邊的每一位執行的,不管它包含的值是多少,對吧?

如果我的假設是真的,有沒有這種情況下的任何語言?

編輯:提示這是一個16位PIC,我們在工作中使用(C代碼),它計算可變時間內的平均值。在M S和Thom的答案之後,我現在明白這是可能的,因爲PIC是在計算時間敏感的基礎上計算任務關鍵信息。

非常感謝大家。

+0

爲了編譯,字面值需要是'long'('1L'等)。 –

回答

2

你說的是真的在Java —操作執行在一個獨立的值的時間。在某些語言(如Lisp)中,如果該值超過數據類型的最大合法值,則執行會自動切換爲使用「大整數」數據包,這會顯着降低執行速度。

EDIT 有所述第一和第二殼體之間的微小差異:值1是特殊(如爲0)。對於

Long first=1L; 

的字節碼是:

lconst_1 
invokestatic #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
astore_1 

而如果不變的是(比方說)2L,一個得到這個字節碼:

ldc2_w #3; //long 2l 
invokestatic #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
astore_2 

由於lconst_1運行速度比ldc2_w,情況1和2之間有輕微的時間差異。

+0

很高興知道Lisp。這些都是微妙的東西,可以咬你當你轉移語言。謝謝。 – Sheriff

1

我不知道任何,但我可以設想一種語言,它只是一個「整數」數據類型,根據需要調整整數的大小,導致小數字比大數字更快。 (考慮Java的BigInteger類)。

至於你在那裏的代碼,沒有那些會完全與輕微異常監守你正在使用的不是Longlong會得到相同的性能預先做了firstsecondLong其他的必須在第二個例子中創建。

如果你使用像你的第二個在你的第一個例子20020110000000000100000000001值,他們會是相同的。

+0

好抓。我對L/l位進行了愚蠢的處理。好的區別。謝謝。 – Sheriff

1

它不依賴於語言,而是依賴於底層硬件。寄存器大小和數據總線寬度。例如,如果Long.MAX_VALUE在16位機器中大於16位,則需要2個週期來將數據加載到存儲器中,因此情況1和情況2將具有不同的執行時間。

通常這些最大值與機位大小

+0

關於總線寬度,週期數等:這取決於所加載的數據類型,而不是數據本身。 –

1

也許不是一個答案,根據設定,但在32位計算機上,64位值不是線程安全的,因爲它必須在寄存器中放置半值然後計算,然後另一半。可能會有一個優化會忽略值的全零部分,因此對於較小的數字會更快。

+1

甚至32位值在32位計算機上也不一定是線程安全的。它可以取決於存儲器中存儲的32位的對齊。在Java中,它是特定於實現的:_「Java虛擬機可自由執行寫入長整數和雙整數值的原子或兩部分。」_([Java語言規範第17.7節](http://java.sun.com/docs) /books/jls/third_edition/html/memory.html#17.7)) –