2017-01-29 61 views
0

假設我有以下的Java代碼:性能差

class MyClass{ 
    final Runnable runnable = new Runnable(){ 
     @Override 
     public void run(){ 
      //Do stuff here... 
     } 
    } 
    void method1(){ 
     new Handler().post(runnable); 
    } 

    void method2(){ 
     new Handler().post(new Runnable(){ 
      @Override 
      public void run(){ 
       //Do same stuff here... 
      } 
     }); 
    } 
} 

方法1()使用被定義爲一類的最終可運行變量一次,因爲對象被創建。 method2()每次調用時都會定義並使用相同的可運行對象。

假設可運行裏面的代碼是很多,並且這些方法被調用非常頻繁的移動設備,其中絲毫的性能提升讚賞:

是否有方法1和方法2之間有什麼區別,只要性能如何?我正在編寫一個android應用程序,並且我有很多定義和使用可運行和偵聽器的方法。我試圖儘可能減少性能開銷,所以我想知道這是否有什麼區別?如果可能我應該將偵聽器和可運行參數定義爲final變量(也許是靜態的)類變量,然後使用它們(但只能使用一次)?我的意思是,除了代碼的可讀性,維護等外,我在這裏很好地考慮了性能。

+0

如果他們經常被調用,也許你不應該每次都創建一個Handler實例 – lelloman

回答

0

方法2不使用相同的runnable-每次調用將是annonymous運行的類的不同實例。

但是那麼說 - 你說的是微觀,微觀優化,如果兩者之間有任何區別。如果兩個runnable具有相同的代碼,那麼該代碼將花費相同的時間運行。唯一的區別可能是可運行的實例化時間。創建runnable所需的時間佔用了很少的時間,發佈它,等待它循環到隊列的前端,並執行,你不應該擔心它。

如果你正在尋找的優化,你不應該看這種類型的東西─找地方,你可以使用不同的算法具有更好的性能,或者不同的數據結構。從這個問題上節省下來的時間將會使你從這樣的擔憂中拯救出什麼。如果您確實認爲這是一個問題,請運行一個分析器並查看您實際花費時間並修復問題的位置。

+0

那麼,這只是一個例子。我主要在onCreateView中實例化對話框和片段的監聽器,所以我希望這些函數儘可能快地返回,因爲它們與UI有關。一般來說,應用程序運行良好,我沒有任何問題,我只是對實例化時間感到好奇。它有什麼不同嗎? –