精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android應用開發者指南:性能優化

移動開發 Android
本文為致力于Android官方應用文檔漢化的網友們發布的最新一章《Android應用開發者指南》,原文為(Dev Guide)/Best Practices/Designing For Performanc,這里譯為“性能優化”,版本為Android 3.1 r1。

性能優化

Android應用程序運行的移動設備受限于其運算能力,存儲空間,及電池續航。由此,它必須是高效的。電池續航可能是一個促使你優化程序的原因,即使他看起來已經運行的足夠快了。由于續航對用戶的重要性,當電量耗損陡增時,意味這用戶遲早會發現是由于你的程序。

雖然這份文檔主要包含著細微的優化,但這些絕不能成為你軟件成敗的關鍵。選擇合適的算法和數據結構永遠是你最先應該考慮的事情,但這超出這份文檔之外。

簡介

寫出高效的代碼有兩條基本的原則:

◆不作沒有必要的工作。

◆盡量避免內存分配。

明智的優化

這份文檔是關于Android規范的細微優化,所以先確保你已經了解哪些代碼需要優化,并且知道如何去衡量你所做修改所帶來的效果(好或壞)。開發投入的時間是有限的,所以明智的時間規劃很重要。

這份文檔同時確保你在算法和數據結構上作出最佳選擇的同時,考慮API選擇所帶來的潛在影響。使用合適的數據結構和算法比這里的任何建議都更有價值,優先考慮API版本帶來的影響有助于你找到更好的實現。(這在類庫代碼中更為重要,相比應用代碼)

在優化Android程序時,會遇到的一個棘手問題是,保證你的程序能在不同的硬件平臺上運行。虛擬機版本和處理器各部相同,因此運行在之上的速度也大不一樣。但這并且不是簡單的A比B快或慢,并能在設備間做出排列。特別的,模擬器上只能評測出一小部分設備上體現的東西。有無JIT的設備間也存在著巨大差異,在JIT設備上好的代碼有時候會在無JIT的設備上表現的并不好。

如果你想知道一個程序在設備上的具體表現,就必須在上面進行測試。

避免創建不必要的對象

對象創建永遠不會是免費的。每個線程的分代GC給零時對象分配一個地址池以降低分配開銷,但往往內存分配比不分配需要的代價大。

如果在用戶界面周期內分配對象,就會強制一個周期性的垃圾回收,給用戶體驗增加小小的停頓間隙。Gingerbread中提到的并發回收也許有用,但不必要的工作應當被避免的。

因此,應該避免不必要的對象創建。下面是幾個例子:

◆如果有一個返回String的方法,并且他的返回值常常附加在一個StringBuffer上,改變聲明和實現,讓函數直接在其后面附加,而非創建一個短暫存在的零時變量。

◆當從輸入的數據集合中讀取數據時,考慮返回原始數據的子串,而非新建一個拷貝.這樣你雖然創建一個新的對象,但是他們共享該數據的char數組。(結果是即使僅僅使用原始輸入的一部分,你也需要保證它的整體一直存在于內存中。)

一個更徹底的方案是將多維數組切割成平行一維數組:

◆Int類型的數組常有余Integer類型的。推而廣之,兩個平行的int數組要比一個(int,int)型的對象數組高效。這對于其他任何基本數據類型的組合都通用。

◆如果需要實現一個容器來存放元組(Foo,Bar),兩個平行數組Foo[],Bar[]會優于一個(Foo,Bar)對象的數組。(例外情況是:當你設計API給其他代碼調用時,應用好的API設計來換取小的速度提升。但在自己的內部代碼中,盡量嘗試高效的實現。)

通常來講,盡量避免創建短時零時對象.少的對象創建意味著低頻的垃圾回收。而這對于用戶體驗產生直接的影響。#p#

性能之謎

前一個版本的文檔給出了好多誤導人的主張,這里做一些澄清:

在沒有JIT的設備上,調用方法所傳遞的對象采用具體的類型而非接口類型會更高效(比如,傳遞HashMap map比Map map調用一個方法的開銷小,盡管兩個map都是HashMap).但這并不是兩倍慢的情形,事實上,他們只相差6%,而有JIT時這兩種調用的效率不相上下。

在沒有JIT的設備上,緩存后的字段訪問比直接訪問快大概20%。而在有JIT的情況下,字段訪問的代價等同于局部訪問,因此這里不值得優化,除非你覺得他會讓你的代碼更易讀(對于final ,static,及static final 變量同樣適用)

用靜態代替虛擬

如果不需要訪問某對象的字段,將方法設置為靜態,調用會加速15%到20%。這也是一種好的做法,因為你可以從方法聲明中看出調用該方法不需要更新此對象的狀態。

避免內部的Getters/Setters

在源生語言像C++中,通常做法是用Getters(i=getCount())代替直接字段訪問(i=mCount)。這是C++中一個好的習慣,因為編譯器會內聯這些訪問,并且如果需要約束或者調試這些域的訪問,你可以在任何時間添加代碼。

而在Android中,這不是一個好的做法。虛方法調用的代價比直接字段訪問高昂許多。通常根據面向對象語言的實踐,在公共接口中使用Getters和Setters是有道理的,但在一個字段經常被訪問的類中宜采用直接訪問。

無JIT時,直接字段訪問大約比調用getter訪問快3倍。有JIT時(直接訪問字段開銷等同于局部變量訪問),要快7倍。在Froyo版本中確實如此,但以后版本可能會在JIT中改進Getter方法的內聯。

對常量使用Static Final修飾符

考慮下面類首的聲明:

編譯器會生成一個類初始化方法,當該類初次被使用時執行,這個方法將42存入intVal中,并得到類文件字符串常量strVal的一個引用。當這些值在后面被引用時,他們通過字段查找進行訪問。

我們改進實現,采用 final關鍵字:

類不再需要方法,因為常量通過靜態字段初始化器進入dex文件中。引用intVal的代碼,將直接調用整形值42;而訪問strVal,也會采用相對開銷較小的“字符串常量”(原文:“sring constant”)指令替代字段查找。(這種優化僅僅是針對基本數據類型和String類型常量的,而非任意的引用類型。但盡可能的將常量聲明為static final是一種好的做法。

使用改進的For循環語法

改進for循環(有時被稱為“for-each”循環)能夠用于實現了iterable接口的集合類及數組中。在集合類中,迭代器讓接口調用hasNext()和next()方法。在ArrayList中,手寫的計數循環迭代要快3倍(無論有沒有JIT),但其他集合類中,改進的for循環語法和迭代器具有相同的效率。

這里有一些迭代數組的實現:

zero()是當中最慢的,因為對于這個遍歷中的歷次迭代,JIT并不能優化獲取數組長度的開銷。

One()稍快,將所有東西都放進局部變量中,避免了查找。但僅只有聲明數組長度對性能改善有益。

Two()是在無JIT的設備上運行最快的,對于有JIT的設備則和one()不分上下。他采用了JDK1.5中的改進for循環語法。

結論:優先采用改進for循環,但在性能要求苛刻的ArrayList迭代中,考慮采用手寫計數循環。

在私有內部內中,考慮用包訪問權限替代私有訪問權限

考慮下面的定義:

需要注意的關鍵是:我們定義的一個私有內部類(Foo$Inner),直接訪問外部類中的一個私有方法和私有變量。這是合法的,代碼也會打印出預期的“Value is 27”。

但問題是,虛擬機認為從Foo$Inner中直接訪問Foo的私有成員是非法的,因為他們是兩個不同的類,盡管Java語言允許內部類訪問外部類的私有成員,但是通過編譯器生成幾個綜合方法來橋接這些間隙的。

內部類會在外部類中任何需要訪問mValue字段或調用doStuff方法的地方調用這些靜態方法。這意味著這些代碼將直接存取成員變量表現為通過存取器方法訪問。之前提到過存取器訪問如何比直接訪問慢,這例子說明,某些語言約會定導致不可見的性能問題。

如果你在高性能的Hotspot中使用這些代碼,可以通過聲明被內部類訪問的字段和成員為包訪問權限,而非私有。但這也意味著這些字段會被其他處于同一個包中的類訪問,因此在公共API中不宜采用。

合理利用浮點數

通常的經驗是,在Android設備中,浮點數會比整型慢兩倍,在缺少FPU和JIT的G1上對比有FPU和JIT的Nexus One中確實如此(兩種設備間算術運算的絕對速度差大約是10倍)

從速度方面說,在現代硬件上,float和double之間沒有任何不同。更廣泛的講,double大2倍。在臺式機上,由于不存在空間問題,double的優先級高于float。

但即使是整型,有的芯片擁有硬件乘法,卻缺少除法。這種情況下,整型除法和求模運算是通過軟件實現的,就像當你設計Hash表,或是做大量的算術那樣。#p#

了解并使用類庫

選擇Library中的代碼而非自己重寫,除了通常的那些原因外,考慮到系統空閑時會用匯編代碼調用來替代library方法,這可能比JIT中生成的等價的最好的Java代碼還要好。典型的例子就是String.indexOf,Dalvik用內部內聯來替代。同樣的,System.arraycopy方法在有JIT的Nexus One上,自行編碼的循環快9倍。

合理利用本地方法

本地方法并不是一定比Java高效。最起碼,Java和native之間過渡的關聯是有消耗的,而JIT并不能對此進行優化。當你分配本地資源時(本地堆上的內存,文件說明符等),往往很難實時的回收這些資源。同時你也需要在各種結構中編譯你的代碼(而非依賴JIT)。甚至可能需要針對相同的架構來編譯出不同的版本:針對ARM處理器的GI編譯的本地代碼,并不能充分利用Nexus One上的ARM,而針對Nexus One上ARM編譯的本地代碼不能在G1的ARM上運行。

當你想部署程序到存在本地代碼庫的Android平臺上時,本地代碼才顯得尤為有用,而并非為了Java應用程序的提速。

結語

最后:通常考慮的是:先確定存在問題,再進行優化。并且你知道當前系統的性能,否則無法衡量你進行嘗試所得到的提升。

這份文檔中的每個主張都有標準基準測試作為支持。你可以在code.google.com“dalvik”項目中找到基準測試的代碼。

這個標準基準測試是建立在Caliper Java標準微基準測試框架之上的。標準微基準測試很難找到正確的路,所以Caliper幫你完成了其中的困難部分工作。并且當你會察覺到某些情況的測試結果并想象中的那樣(虛擬機總是在優化你的代碼的)。我們強烈推薦你用Caliper來運行你自己的標準微基準測試。

同時你也會發現Traceview對分析很有用,但必須了解,他目前是不不支持JIT的,這可能導致那些在JIT上可以勝出的代碼運行超時。特別重要的,根據Taceview的數據作出更改后,請確保代碼在沒有Traceview時,確實跑的快了。

譯者署名: qiongju@gmail.com

譯者鏈接http://admires.iteye.com/

版本:Android 3.1 r1

原文http://developer.android.com/guide/practices/design/performance.html

責任編輯:佚名 來源: iteye
相關推薦

2020-07-15 07:00:00

移動應用開發者指南

2021-12-25 22:31:55

Sentry 監控SDK 開發 性能監控

2011-04-13 09:55:16

Mail APIBlackBerry

2011-04-13 13:38:57

選項APIBlackBerry

2011-04-13 11:31:06

PIM APIBlackBerry

2010-10-19 11:14:06

2011-04-02 13:44:08

2018-03-27 23:25:40

Paddle

2017-11-27 13:09:00

AndroidGradle代碼

2011-04-13 14:10:27

.alx文件BlackBerry

2013-08-29 13:41:42

Windows 8.1

2013-12-18 14:41:06

蘋果開發者iOS 7

2024-02-01 09:37:42

Kubernetes服務網格? 命令

2024-05-07 08:45:16

OpenAILlamaIndex大語言模型

2019-08-16 10:55:37

開發者技能AI

2021-12-31 18:35:40

監控Sentry開發

2012-05-21 22:04:02

Android

2022-01-02 23:26:08

開發SDK Sentry

2011-04-14 10:34:08

BlackBerry

2022-01-11 20:42:54

開發Sentry標志
點贊
收藏

51CTO技術棧公眾號

亚洲国产欧美国产综合一区| 精品一区二区三区四区五区| 国产精品三级av在线播放| 国产日韩在线看| 青青草原国产视频| 日韩有码一区| 91精品国产综合久久精品性色| 欧美在线观看黄| 美女做暖暖视频免费在线观看全部网址91 | 成年网站在线| 高清av一区二区| 日韩男女性生活视频| 青青草国产在线观看| 久久99视频| 日韩美女一区二区三区四区| 国产视频一区二区三区在线播放| 伊人电影在线观看| 国产欧美日韩亚州综合| 国产在线精品日韩| 国产色片在线观看| 日本系列欧美系列| 国内免费精品永久在线视频| 中文字幕无码日韩专区免费| 欧美电影完整版在线观看| 宅男噜噜噜66一区二区66| 国产黄色特级片| 国内老司机av在线| 亚洲精品国产品国语在线app| 欧美亚洲免费高清在线观看 | 精品无人区卡一卡二卡三乱码免费卡| 久久免费视频网| 国产美女久久久久久| 国产精品三级| 亚洲精品久久久久久下一站| 男人女人拔萝卜视频| 日本中文字幕视频一区| 色综合色综合色综合色综合色综合 | 亚洲黄色a级片| 激情久久久久久久久久久久久久久久| 国产精品99久久久久久www| 亚洲国产综合久久| 亚洲国产免费看| 欧美丰满片xxx777| 男女羞羞免费视频| 牛夜精品久久久久久久99黑人| 综合国产在线视频| 91狠狠综合久久久久久| 国产91精品对白在线播放| 亚洲电影免费观看| 男女一区二区三区| 老司机凹凸av亚洲导航| 亚洲国产一区二区三区四区| 潘金莲一级淫片aaaaa| 亚洲亚洲一区二区三区| 欧美一级视频精品观看| 99999精品| 精品亚洲二区| 日韩欧美高清在线| 久久性爱视频网站| 日韩动漫一区| 亚洲欧美在线一区| 国产jjizz一区二区三区视频| 国产精品一区高清| 中文字幕日韩视频| 中国一级片在线观看| 欧美成人一区二免费视频软件| 伦伦影院午夜日韩欧美限制| 三级影片在线看| 在线精品一区| 日本精品va在线观看| 久久久久久久久久一级| 久久se这里有精品| 97在线电影| 亚洲精品国产精| 不卡的av电影| 日本成人黄色免费看| melody高清在线观看| 国产精品久久久久久亚洲毛片| 综合一区中文字幕| 白白色在线观看| 色琪琪一区二区三区亚洲区| 亚洲欧美日韩综合网| 国产亚洲亚洲国产一二区| 精品国产一区二区三区av性色| 中文字幕精品视频在线| 中文字幕av一区二区三区人| 这里只有视频精品| 久久久国产精华液| 老司机久久99久久精品播放免费| 国产免费观看久久黄| 蜜桃av中文字幕| 国产色91在线| 国产成人一二三区| 美女福利一区二区| 日韩一区二区精品在线观看| 男生裸体视频网站| 国产精品久久占久久| 97人人模人人爽人人喊中文字 | 日韩视频一区二区三区在线播放免费观看| 777午夜精品福利在线观看| 国产成人自拍偷拍| 成人三级在线视频| 亚洲精品免费在线看| 色婷婷av在线| 欧美日韩卡一卡二| 国产 中文 字幕 日韩 在线| 天天色天天射综合网| 2021久久精品国产99国产精品| 国产一区二区女内射| 久久一区二区视频| 国产日本在线播放| 福利一区三区| 亚洲一区二区精品| 五月婷婷亚洲综合| 国产传媒欧美日韩成人| 亚洲不卡中文字幕| av影片在线| 91精选在线观看| 国产视频三区四区| 亚洲美女黄色| 99超碰麻豆| 黄网站视频在线观看| 在线看一区二区| 免费的av网站| 红桃视频国产精品| 91精品视频免费| av中文在线| 色8久久人人97超碰香蕉987| 丰满熟女人妻一区二区三区| 欧美在线免费| 成人免费在线视频网址| 波多野结衣在线网站| 色播五月激情综合网| 双性尿奴穿贞c带憋尿| 欧美特黄一区| 99porn视频在线| 成人在线播放免费观看| 欧美日韩dvd在线观看| 尤物视频最新网址| 亚洲一区黄色| 久久久久久a亚洲欧洲aⅴ| 动漫一区二区| 亚洲激情在线观看视频免费| 精品无码久久久久| 成人黄色大片在线观看 | 国产调教视频在线观看| 欧美日韩国产首页| 国产中文字幕久久| 久久精品国产网站| 大地资源第二页在线观看高清版| 久久精品资源| 波霸ol色综合久久| 国产精品久久久久毛片| 国产日韩精品一区二区三区在线| 成人精品视频一区二区| 国产伦精品一区二区三区视频 | a级网站在线观看| 国产精品久一| 色综合久久精品亚洲国产| 99精品久久久久久中文字幕 | 最近看过的日韩成人| 国产高清亚洲| 欧美激情手机在线视频 | 日本一区二区中文字幕| 久久久久999| 午夜精品久久久久久久96蜜桃 | 在线中文字幕日韩| 久久这里只有精品9| 国产精品美女久久久久久久久| 中文字幕66页| 极品av少妇一区二区| 久久精品国产第一区二区三区最新章节 | 日本少妇高潮喷水视频| 亚洲宅男一区| 国产精品久久久久999| 日本a在线播放| 精品欧美一区二区久久 | 欧美日韩黄色影视| 久久久精品国产sm调教| 99精品视频在线播放观看| 可以免费观看av毛片| 久久在线电影| 大波视频国产精品久久| gogo亚洲高清大胆美女人体| 久久色精品视频| 人妻妺妺窝人体色www聚色窝 | 亚洲怡红院av| 亚洲国产精品久久人人爱 | 国产露脸国语对白在线| 亚洲无人区一区| 人妻av无码一区二区三区| 国产一区二区三区香蕉| 黄色www网站| 日韩三级在线| 国产一区二区三区av在线| 美女网站视频一区| 国内揄拍国内精品| 99reav在线| 精品99一区二区| 艳妇乳肉豪妇荡乳av无码福利| 亚洲激情成人在线| 久久丫精品忘忧草西安产品| 国产成人亚洲精品青草天美| 九九热免费精品视频| 影音先锋在线一区| 正在播放91九色| 亚州av一区| 91中文字精品一区二区| 久久亚洲人体| 26uuu日韩精品一区二区| 怡红院在线播放| 在线色欧美三级视频| 日本免费网站在线观看| 欧美日韩国产一二三| 中文在线第一页| 亚洲综合激情另类小说区| 青青青视频在线免费观看| 久久影院视频免费| www.17c.com喷水少妇| 国产一区二区三区在线观看免费| caoporn超碰97| 中文高清一区| 无码人妻精品一区二区蜜桃网站| 成人网18免费网站| 日韩.欧美.亚洲| 九九热hot精品视频在线播放| 91中文精品字幕在线视频| 97欧美成人| 日韩女在线观看| 美女的胸无遮挡在线观看| 欧美激情精品久久久久久蜜臀| 亚洲s色大片| 这里只有精品久久| 成人性生交大片免费看午夜| 亚洲欧美日韩高清| 日韩三级电影网| 亚洲加勒比久久88色综合| 亚洲女人18毛片水真多| 日韩小视频在线观看专区| 国产精品一区二区av白丝下载 | 牛牛精品成人免费视频| av一区二区三区免费| 国产人与zoxxxx另类91| 91在线视频精品| 精品国产亚洲一区二区三区大结局| 国产精品视频成人| 草民电影神马电影一区二区| 国产精品福利在线观看网址| 日韩欧美2区| 国产精品第七十二页| 午夜欧美巨大性欧美巨大| 日韩美女免费线视频| 欧美特黄aaaaaaaa大片| 国产成人精品av在线| 欧美色网一区| 国产精品久久久久久久久免费| 欧美与亚洲与日本直播| 国产精品私拍pans大尺度在线| 国产一区高清| 91色在线观看| 97se亚洲国产一区二区三区| 国产免费一区二区| 夜夜躁狠狠躁日日躁2021日韩| 欧美日韩另类综合| 日韩精品久久久久久久电影99爱| 亚洲免费av网| 欧美日韩国内| 99视频在线免费播放| 久久久久久黄| 在线观看免费污视频| 国产精品一区专区| 亚洲精品乱码久久| 国产日韩在线不卡| 女人18毛片毛片毛片毛片区二| 亚洲精品视频一区二区| 国产精品19乱码一区二区三区| 色综合激情五月| 91久久偷偷做嫩草影院| 亚洲在线视频播放| 日韩免费在线观看| 性感美女一级片| 一区二区三区视频观看| 超碰在线最新| 18一19gay欧美视频网站| 成人亚洲网站| 国产成人一区二区三区免费看| 神马日本精品| 中文字幕中文字幕在线中一区高清| 黄色日韩在线| 美女网站视频黄色| 丁香一区二区三区| 男人的天堂官网| 亚洲第一激情av| 一区二区三区麻豆| 亚洲爱爱爱爱爱| 在线a人片免费观看视频| 久久久久日韩精品久久久男男| 日韩视频网站在线观看| 99视频国产精品免费观看| 国产videos久久| 青青视频免费在线观看| 国产精品日韩| 手机看片国产精品| 久久久久久久久久久99999| 欧美精品入口蜜桃| 欧美视频一二三区| 天堂资源最新在线| 欧美精品一区二区免费| 日韩欧美精品电影| 精品国产综合| 欧美视频官网| 亚洲图片 自拍偷拍| 国产欧美一区二区三区网站| 国产精品111| 欧美一级夜夜爽| 视频一区二区三区不卡| 日韩美女av在线免费观看| 丁香5月婷婷久久| 天天做天天爱天天高潮| 日本不卡一区二区三区高清视频| 亚洲精品在线视频免费观看| 亚洲在线视频一区| 91精品视频免费在线观看| 亚洲男人7777| 春色校园综合激情亚洲| 99久久精品免费看国产一区二区三区| 久久裸体网站| 九色91popny| 久久精品亚洲麻豆av一区二区| 男女视频免费看| 亚洲成av人片在线观看香蕉| 主播国产精品| 3d动漫精品啪啪一区二区三区免费 | 亚洲自拍偷拍视频| 久久免费大视频| 色多多视频在线播放| 久久精品视频一区二区| 免费看一级视频| 亚洲美女黄色片| 97成人资源| 免费av一区二区三区| 久久成人精品| 18禁裸乳无遮挡啪啪无码免费| 五月天亚洲婷婷| 天天影院图片亚洲| 欧洲成人在线观看| 免费久久精品| 亚洲色精品三区二区一区| 久久久国产精品麻豆| 国产三级精品三级在线观看| 亚洲色图15p| 九色成人搞黄网站| 中国人体摄影一区二区三区| 狠狠色丁香婷婷综合| 亚洲成人生活片| 精品三级在线看| a级片免费在线观看| 麻豆av一区二区三区久久| 久久永久免费| 免费黄在线观看| 6080yy午夜一二三区久久| av色综合久久天堂av色综合在| 亚洲自拍偷拍网址| 91久久在线| 色一情一交一乱一区二区三区| 欧美亚洲免费在线一区| 欧美69xxx| 福利精品视频| 免费永久网站黄欧美| 五月婷婷婷婷婷| 日韩午夜精品电影| 秋霞伦理一区| 亚洲日本无吗高清不卡| 国产乱码一区二区三区| 亚洲欧美在线视频免费| 在线性视频日韩欧美| 午夜精品在线| 欧美污视频网站| 中文字幕一区二区视频| 俄罗斯嫩小性bbwbbw| 国产91在线播放| 亚洲女同中文字幕| 性色av蜜臀av色欲av| 欧美色爱综合网| 啦啦啦中文在线观看日本| 欧美中文娱乐网| 国产美女娇喘av呻吟久久| 99热在线观看免费精品| 日韩中文在线视频| jizz国产精品| 免费黄色一级网站| 亚洲最新视频在线观看| 国产在线中文字幕| 成人高清在线观看| 日本欧美一区二区三区乱码 | 色婷婷国产精品久久包臀| 在线免费观看黄色网址| 久精品国产欧美| 国产乱人伦精品一区二区在线观看| 99久久精品国产亚洲|