2013-01-12 58 views
0

閱讀如何微調我的代碼幾篇文章後,我發現,在路上,我們正在申報對象和變量可以drasticatly影響我們的應用程序的性能。這一點越來越重要,因爲時間限制現在已成爲Android平臺某些方面的組成部分(例如,某些操作必須在5秒內提供結果)。現在哪一種語法使用更好的性能和資源利用率

,我發現下面的代碼在我的片段類(完美的功能)中的一個:

Activity myA = getActivity(); 
if(myA instanceof MainActivity) { 
((MainActivity) myA).doNext(); 
} 

知道對象的創建/銷燬和ressources分配是一些有助於排出時的設備的因素電池,我想要重寫我的代碼:

if(getActivity() instanceof MainActivity) { 
((MainActivity) getActivity()).doNext(); 
} 

從功能角度來看,兩個代碼都提供相同的結果。但是,最適合的方法是什麼?我在問,因爲我看到兩者都有利弊,我無法找到評估性能的適當方式,我也不清楚哪些計數器(內存使用情況,功能速度,使用的CPU週期等) )應該進行評估。

感謝您的貢獻提前。

+1

對象創建/銷燬在設備上每秒發生數千次;你確定值得在這個層面上優化它嗎? –

+0

我同意我的例子是一個非常基本的例子,我很可能不會投入太多時間來優化這個特定的代碼。我的興趣更多的是從全球角度來看,因爲我們經常這樣做類型的分配和/​​或對象建設,那麼最終總體性能可能會受到影響。根據性能,我不僅考慮速度,還考慮對外部資源(電池等)的影響。 –

+0

@DominicHarvey從全局角度來看,您絕對必須使用探查器,因爲它是實際上會告訴您的唯一工具關於全球視角的任何事情。 – millimoose

回答

4

猜測這可能是一個性能瓶頸的時候一個很常見的浪費。你必須測量對整個程序有什麼影響,而不是猜測。

知道對象的創建/破壞的因素

創建幾個對象都無所謂的。創建太多的對象事物。多少太多以及哪些對象創建得最多是您應該使用分析器來確定的事情。

從功能的角度看,這兩種碼被提供相同的結果。但是,最適合的方法是什麼?

不管你覺得是最簡單的。我相信在getActivity()返回的類中加入方法doNext將是最好的,所以你可以寫下面最清晰的。

getActivity().doNext(); 

我無法找到合適的方法來評估業績

使用CPU和內存分析器,或寫你的系統的不同組件的性能測試。

計數器(內存使用情況,功能速度,使用的CPU週期等)應執行評估。

如果你不能使用探查器,我會從經過時間開始簡單。即System.nanoTime()。這通常是你所需要的。

+0

非常感謝彼得。你有什麼好的資料來推薦?我在Window 7上使用Eclips。 –

+0

我會從VisualVM開始,它是免費的,並附帶JDK。我使用YourKit,您可以獲得一個eval許可證(2周免費??),這通常足以解決您的問題。 ;) –

+0

我已經超過15年的性能調整系統我仍然感到驚訝,多麼簡單的一件事,你永遠不會想到,它會對你的表現產生影響。我採訪了對衝基金的高級開發人員,他們花了幾個月時間調整系統,但由於沒有考慮整個系統而丟失了更重要的東西。 –

0

如果getActiviy沒有創建新的對象,而是返回創建取決於一些條件的對象,而不是計算密集型那麼第二種方法比較好。但是,如果每次撥打getActivity,都會創建新對象和/或如果getActivity是計算密集型,則第一種方法會更好。

3

聲明/賦值不是在Java中創建對象。它只是把參考放在堆棧上。第一個更清晰,可能更快(getActivity僅被調用一次)。

1

取決於getActivity()做什麼。兩段代碼的不同之處在於第二段代碼調用2次函數。函數本身的調用非常快,但函數的功能可能並不快。

如果你不知道這是什麼功能,你可以用第一個,但第二個是更具可讀性。

0

如果每次調用getActivity()時都返回一個不同的對象,那麼第二個版本是不正確,,如果沒有,第二個版本只是多餘的。既不是喜歡第二個版本的理由,也沒有任何其他理由可以選擇它。正如Pater Lawrey所說,不要浪費時間去猜測你的性能問題。測量。