2014-03-29 74 views
1

在某些情況下,我們使用一個循環爲方便起見,也可以「手動」執行一些操作,例如從我的應用程序處理MenuItem S:增強的for循環VS處理對象手動

  1. 我創建了一個MenuItem s,然後使用增強的for循環遍歷它。

    MenuItem[] fileActionsToLock ={ mMenu.findItem(R.id.action_share), 
               mMenu.findItem(R.id.action_rename), 
               mMenu.findItem(R.id.action_copy), 
               mMenu.findItem(R.id.action_move) }; 
    for (MenuItem i : fileActionsToLock) { 
        i.setEnabled(false); 
        i.getIcon().setAlpha(100); 
    } 
    
  2. 我單獨申請的值給每個MenuItem

    mMenu.findItem(R.id.action_share).setEnabled(false); 
    mMenu.findItem(R.id.action_share).getIcon().setAlpha(100); 
    mMenu.findItem(R.id.action_rename).setEnabled(false); 
    mMenu.findItem(R.id.action_rename).getIcon().setAlpha(100); 
    mMenu.findItem(R.id.action_copy).setEnabled(false); 
    mMenu.findItem(R.id.action_copy).getIcon().setAlpha(100); 
    mMenu.findItem(R.id.action_move).setEnabled(false); 
    mMenu.findItem(R.id.action_move).getIcon().setAlpha(100); 
    

由於只有幾個元素,性能目視相同的。

  • 但是哪個代碼工作得更快,爲什麼?
  • 另外,在哪個時間點fileActionsToLock數組和臨時MenuItemi將被垃圾收集?

回答

2

(1)我不認爲任何一個人跑得比另一個跑得快得多。循環將會有更多的開銷(例如,請參閱下面有關需要迭代器的註釋),但是需要大約相同的時間才能完成,就好像您只是單獨寫出所有步驟一樣。底線 - 你不會注意到一個區別。我會使用循環,因爲它可能使您的代碼更易於閱讀。

(2)什麼時候垃圾收集很難說。通常,當沒有更多引用指向它時,對象將有資格進行垃圾回收。實際發生的方式和時間取決於您的單個設備的JVM正在運行的其他代碼和垃圾收集。不同版本的Android操作系統有不同類型的垃圾收集器。 Some more about garbage collectors可以在這裏找到和also here

+2

由於不需要像增強for循環那樣創建迭代器,因此手冊的速度會更快。它並沒有真正有所作爲,特別是在這種情況下只有很少的項目。不過,使用for循環的+1。明顯更容易和更好地擴展。 –

+0

循環展開是一種常見的優化,比將語句組合成循環容易。把它寫成一個循環不僅更加清晰,而且還將JVM的展開決策留給了JVM,JVM擁有更多關於運行時環境的數據。 –

+0

具有JIT的JVM不會自行展開循環嗎?迭代器將創建更多的開銷,並在創建它時最初放慢整個過程,但我不知道實際代碼將在循環的外側執行得更快。 – Rarw

1

非循環方法肯定更快。比較標準for循環更容易,因爲我們確切地知道發生了什麼,所以我將以此爲例。循環開始時,我們聲明變量檢查滿足條件,然後運行第一個代碼塊。在第一塊代碼運行之後,我們在檢查條件然後重複之前運行一個語句。

所有這些額外事件(聲明一個額外的變量,檢查條件並運行最終語句)不會發生在你的第二個例子中。發生較少,所以它會一直更快。也就是說,這些額外的操作對現代計算機來說花費的時間或精力很少,所以它實在不值得擔心。差異可以忽略不計。這麼小,以至於他們不可能對您的應用程序產生任何影響。即使foreach循環比for循環快,仍然存在正在執行的操作,這些操作不在您的手動示例中。

當決定何時使用其中一種或另一種時,您應該使用的標準是可讀性,功能性,可擴展性等。讀取循環更容易,而且需要更少的代碼行。該循環可用於動態檢查條件,使其更具功能性。最後一個循環更具可擴展性。您可以稍後將更多Object添加到循環陣列中,而無需更改代碼。

至於垃圾收集,應該沒有任何區別。在任何可訪問和正在運行的代碼中都不存在對它們的引用時,它們都將有資格收集。

0

您可以閱讀關於它in this article。手動方式通常比循環更快,然後增強,因爲它不會調用迭代器上的任何方法。對於循環來說,它也比普通循環更快,因爲它不包含跳轉和遞增指令 - 但這不是一個真正的問題,因爲沒有人會在元素的hundrets上執行手動操作,以便從CPU中獲得幾個ms。