2013-03-07 47 views
0

計數變量的值將是0或1或2只「for循環」只循環一次或兩次。是否更好的選擇?

下面是什麼,我想實現 如果計數爲1,只做一次,如果2做點什麼兩次

這是一個更好的解決方案

 for(int j=0;j<count;j++){ 
      System.out.println("PRINTING..."); 
     } 

或本

 if(count==1){ 
      System.out.println("PRINTING..."); 
     }else if (count==2){ 
      System.out.println("PRINTING..."); 
      System.out.println("PRINTING..."); 
     } 

我想知道哪一個更好和W HY。

+2

for循環更好。您可能會在將來更改需求,並需要添加3+的計數。不想複製粘貼'System.out ...'並添加'else-if' – 2013-03-07 15:36:14

+1

堅持幹(不要重複自己),我會選擇第一個。 – nhahtdh 2013-03-07 15:36:40

+0

「更好」是否意味着「更快」? – 2013-03-07 15:38:45

回答

4

顯然是第一個。 不要重複自己! 這個循環展開似乎是過早優化的嚴重情況。

1

這取決於實際要求。

如果「做什麼」對於每次迭代總是相同的事情,顯然該循環更好。

如果不是,則它依賴於的差異的性質,差的數量(例如,是否有一個單一的特殊情況下,多個特殊情況下,可以計算出特殊情況下,等)

它也很重要如何可擴展 - 無需更改您想要的代碼。

1

我假設擔心的是性能,因爲從代碼可讀性和可維護性的角度來看,for-loop版本顯然贏得了壓倒性優勢。

如果循環體中的代碼與println調用一樣長,則無關緊要。

如果循環體非常小且快,那麼主要成本將是任何錯誤預測的條件分支或緩存未命中。如果硬件在將條件分支載入流水線後猜測下一條指令有誤,則必須在分支到達執行階段後清空整個流水線。這真的花了錢。

if版本可能會導致比for循環更不常見的條件分支模式。硬件分支預測可能會更好地處理在設計時使用的基準測試中常見的習慣用法。

當處理器將數據轉換爲執行邏輯時,高速緩存未命中會導致暫停。 if版本比較長,因爲它有三個循環體,所以指令緩存未命中的風險較高。他們使用相同的數據,因此他們同樣可能會遇到數據緩存未命中。

我的猜測是,如果有任何可測量的差異,for-loop版本可能會更快。這只是一個猜測。

如果你的程序的性能真的取決於這個循環的寫法,你應該對它進行基準測試。由於依賴於硬件分支預測的微妙之處,我建議在儘可能多的不同處理器上對每個版本的程序進行基準測試。如果這不足以證明你的程序能證明這一點,那麼堅持使用for循環。