2010-03-16 46 views
6

使用股票Sun 1.6編譯器和JRE/JIT,使用Duff's Device展示的大量展開來展開循環是個好主意嗎?或者它最終會成爲代碼混淆而沒有性能優勢?Duff的設備是否加速Java代碼?

我使用的Java分析工具對於逐行CPU使用的信息比valgrind更少,所以我期望通過其他人的經驗來擴充測量。

請注意,當然,你不能確切代碼達夫的設備,但你可以做基本的展開,這就是我想知道的。

 short stateType = data.getShort(ptr); 
     switch (stateType) { 

     case SEARCH_TYPE_DISPATCH + 16: 
      if (c > data.getChar(ptr + (3 << 16) - 4)) { 
       ptr += 3 << 16; 
      } 
     case SEARCH_TYPE_DISPATCH + 15: 
      if (c > data.getChar(ptr + (3 << 15) - 4)) { 
       ptr += 3 << 15; 
      } 
     ... 

通過許多其他值。

+3

我不明白你修改過的問題。達夫的設備並不意味着只是落後。交錯循環是關鍵部分。 – 2010-03-16 01:42:28

+5

你爲什麼不...測試它? 像平常一樣用循環編寫一個版本。用展開的循環編寫一個版本。編寫一個框架,執行每一百萬次(或其他)。看看您的優化嘗試會帶來哪些性能提升。 – 2010-03-16 01:42:43

+0

沒有最好的答案??? O.o – 2011-06-26 18:44:03

回答

22

它是不是很好,它是否是一個好主意(不是),因爲它不會編譯。

編輯:這是明確in the JLS提到:

稱爲達夫設備特技可以用C或C++來展開循環,但這不是Java編程語言的有效代碼:

,或者更直截了當地(從相同的部分):

,了不起C砍,湯姆,但它不是有效的在這裏。

編輯:要回答你更多(太)普遍的問題,通常沒有。你通常應該依靠JIT。

+0

對不起,我沒有提出足夠的不確定性。 – bmargulies 2010-03-16 01:39:00

8

您忽略了Java編譯爲面向堆棧的虛擬機的字節碼的事實。無論您嘗試在Java級別進行哪種低級別優化,都無濟於事。當JIT編譯器爲目標體系結構生成程序集時,會發生真正的優化,這個過程大部分都不能控制也不關心。

您應該優化一個更大的圖片。讓JIT編譯器處理低級優化。

+0

+1爲「看大圖」 – Thilo 2010-03-16 02:55:04

+5

我不是無視它,我問你。 – bmargulies 2010-03-16 11:07:17