2009-10-01 76 views
5

什麼是最容易犯的錯誤,可能會導致Android性能下降?Android上常見的性能陷阱?

文檔中提到「某些浮點運算」可以是「毫秒級」 - 是否有人測試過它?

爲了便於討論,我們假設它在G1 /類似設備上運行。

回答

0

他們希望你避免使用浮點數是因爲它是很少的原因在手機CPU上實現(可能是手臂),並且必須用慢速的軟件來實現。固定點雖然在硬件方面被慣用。

某些電話確實在硬件中實現了浮點運算,但由於您不需要將應用程序部署到哪個電話上,因此不會冒險。

很多人也說避免使用對象,回到真正慢手機和java時代,我習慣用靜態函數編寫java程序。我現在不會推薦。

0

不要擔心性能,直到您知道代碼有重大問題。小小的調整(ints而不是浮點數,使用迭代器而不是顯式數組枚舉)往往是非常小的,當你的應用程序關閉時你最好看着它們。讓5%的代碼更慢,而不是製作整個應用程序。

+4

雖然我同意不優化早期等,這不是問題在這裏。例如,如果所有浮點操作都需要1ms,並且所有的int操作都是1ns,那麼從頭開始設計固定點的所有數據結構就是常識。 – Viktor 2009-10-01 18:41:47

+0

如果你有一個50ms的預算來完成這項工作,如果需要1ms或1ns沒有關係。獲取代碼工作,然後擔心細節。固定點和浮點之間的轉換最多隻需要一天或兩天的時間。 讓你的應用程序運行高效的算法,然後如果你需要做這些優化。 在我看過的幾乎每個應用程序中,大型性能優勢永遠都不是微型優化。他們正在確保你不做愚蠢的事情(繪製對象2x,在不需要時進行排序,...)。 有些情況下,微型優化是正確的。當它發生時,你會知道它 – hacken 2009-10-15 22:01:48

0

根據Android的人,你應該避免使用接口名稱的集合。例如,對於標準的Java標準的最佳做法是說

List<String> strings = new ArrayList<String>(); 

而在Android的,他們說這是更好地與它的運行時類型聲明它

ArrayList<String> strings = new ArrayList<String>(); 
+8

注意 - 儘管在文檔中 - 這實際上並不正確。我已經在froyo的文檔中更正了這一點。 (特別是,文檔的froyo版本不會包含任何基準沒有證實的索賠。) – 2010-02-24 07:29:24

2

WRT浮點:

在G1上,增加兩個浮點大約需要400ns。增加兩個整數大約需要250ns。

上運行eclair(前JIT),操作需要約120ns。 (整數稍微快一點,但你必須注意微基準。)int和long,float和double之間有一個很小的百分比差異,但基本上如果你能買得起它,你可能買得起另一個。

其他目前的設備將介於這兩個極端之間。 (其他操作也會有所不同,乘法比加法/減法更昂貴,並且除法更加昂貴,沒有當前設備具有硬件整數除法。)

但是不要關注這些,直到遇到問題。很可能,您的性能問題將歸結爲算法或數據結構的糟糕選擇,就像每個人的性能問題一樣。

大部分當前(eclair)性能文檔都不正確。在您關心的設備上自己設定基準。但是如果你真的在問「桌面/服務器java程序員應該注意什麼?」,我會建議:不必要的分配。你沒有像在桌面/服務器上那樣做GC的備用內核,並且你沒有像在桌面/服務器上那樣擁有千兆字節的堆。如果你在做GC,那麼你沒有做真正的工作,而且你的堆在目前的設備上最多隻有24MiB。所以你可能想要避免在內部循環中不必要的分配。

+0

*,但在您遇到問題之前不要着迷於此。 的機會是,你的性能問題會下降到可憐的 算法或數據結構的選擇,就像每個人的 的性能問題總是存在。* 這是巨大的。我可以給你一個擁抱嗎? – Cheezmeister 2012-06-12 23:22:23

0

我發現AppInventor仿真器對於浮點操作非常緩慢,即使在2014 i3/4Gb機器上也是如此。我寫了一個分形生成器來對模擬器進行基準測試,發現要計算一個像素,到10次迭代需要超過兩秒鐘 - 是的,2,000毫秒。我還沒有完全解決它,以找到哪些特定的操作如此緩慢,但我將盡快做到這一點。

每次迭代涉及四個乘法,兩個加法和一個減法,五個變量。每次迭代後進行測試涉及兩次乘法,一次加法和兩次比較 - 大約30次觸發。我還沒有通過存儲下一次迭代的結果來優化代碼。顯然,如果有辦法強制使用固定點或只使用整數,那麼這個小項目所面臨的問題的嚴重程度就不是一個好兆頭。