精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

羞羞答答国产精品www一本| 亚洲精品毛片| 99riav久久精品riav| 久久福利视频导航| 黑人巨大猛交丰满少妇| 婷婷成人激情| 精品一区二区久久| 久久精品国产v日韩v亚洲 | 激情视频在线观看免费| 日本特黄久久久高潮| 久久精品成人欧美大片| 日本xxxx免费| 唐人社导航福利精品| 国产网站一区二区三区| 国产在线999| 久久高清无码视频| 日韩超碰人人爽人人做人人添| 欧美日韩国产中文字幕| 欧洲成人一区二区| 国产av一区二区三区| 亚洲深爱激情| 在线观看精品国产视频| 污免费在线观看| 九色porny自拍视频在线观看| 久久蜜桃一区二区| 亚洲free性xxxx护士白浆| 波多野结衣国产| 久久性感美女视频| 亚洲第一色在线| 成人免费视频久久| 午夜羞羞小视频在线观看| 91麻豆精品一区二区三区| 欧美在线观看一区二区三区| 久久嫩草捆绑紧缚| 日韩a级大片| 56国语精品自产拍在线观看| 欧洲黄色一级视频| 乱人伦中文视频在线| 99re成人在线| 亚洲直播在线一区| 亚洲不卡在线视频| 激情丁香综合| 美女精品视频一区| 欧美午夜激情影院| 久草在线综合| 欧美一卡在线观看| 日本精品免费在线观看| 视频在线这里都是精品| 国产精品拍天天在线| 国产一区二区三区高清| 国产精品久久久国产盗摄| 羞羞视频在线观看欧美| 久久久久国产精品www| 亚洲女人毛茸茸高潮| 伊甸园亚洲一区| 精品美女一区二区三区| а 天堂 在线| 日韩色淫视频| 欧美性生交xxxxxdddd| 久久成人福利视频| 黄色网页网址在线免费| 国产三级一区二区| 久久久99爱| 国产精品区在线观看| 日韩国产欧美视频| 欧洲精品久久久| 尤物视频在线观看国产| 亚洲一级网站| 欧美激情亚洲综合一区| 国产三级国产精品国产国在线观看| 成人精品视频| 一区二区国产精品视频| www.狠狠爱| 日韩美女毛片| 日韩精品在线免费观看| 国产精品伦子伦| 精品在线网站观看| 91精品国产aⅴ一区二区| 91小视频网站| 日韩国产一二三区| 欧美二区三区91| 在线a免费观看| 亚洲三级av| 欧美成人伊人久久综合网| gogo亚洲国模私拍人体| 91综合久久爱com| 日韩免费一区二区三区在线播放| 欧美日韩激情视频8区| 亚洲国产一区二区在线| 成人看av片| 精品福利在线看| 国产免费视频传媒| 日韩精品一区国产| 日韩精品中文字幕在线观看| 国产视频123区| 狠狠88综合久久久久综合网| 4438全国亚洲精品在线观看视频| 中文字幕欧美人妻精品| 粉嫩绯色av一区二区在线观看| 欧美极品色图| 国产丝袜在线| 色丁香久综合在线久综合在线观看| 亚洲人视频在线| 哺乳挤奶一区二区三区免费看| 国产一区二区日韩| 国产在线拍揄自揄拍| 日本中文字幕一区二区视频| 999精品视频一区二区三区| 毛片网站在线| 一区二区三区精品视频| 黄色三级视频片| 视频精品一区| 精品国产一区二区三区久久狼5月| 国产精品99re| 激情深爱一区二区| 日韩.欧美.亚洲| 九色porny丨国产首页在线| 91精品国产综合久久小美女| 亚洲综合色一区| 激情久久五月| 1区1区3区4区产品乱码芒果精品| 久草在线免费福利资源| 亚洲国产欧美在线| 一级黄色片在线免费观看| 国产亚洲精品美女久久久久久久久久| 欧美国产日韩精品| 国产精品毛片一区视频播 | 国产66精品久久久久999小说| 成人免费在线观看| 欧美日韩中文字幕| yjizz视频| 欧美xxx在线观看| 国产欧美亚洲视频| 成a人v在线播放| 一本色道a无线码一区v| 在线黄色免费网站| 国内久久精品| 91aaaa| 欧洲不卡视频| 91精品国产一区二区人妖| 久久视频一区二区三区| 日韩高清在线观看| 日韩av电影免费播放| 中文字幕一区久| 日韩成人黄色av| 日韩欧美激情视频| 成av人片一区二区| 国产美女在线一区| 韩国女主播一区二区三区| 欧美高清电影在线看| 国产99久一区二区三区a片| 亚洲精品你懂的| 日本肉体xxxx裸体xxx免费| av中文字幕一区二区| 国产精品久久久久福利| av电影在线观看一区二区三区| 91福利国产精品| 九九热免费在线| 久久丁香综合五月国产三级网站| 一区二区91美女张开腿让人桶| 欧美成人毛片| 欧美成年人视频网站| 亚洲男人天堂久久| 婷婷中文字幕综合| 青娱乐国产视频| 狠狠色丁香久久婷婷综合丁香| 中文网丁香综合网| 亚洲精品福利| 欧美一级高清免费播放| 蜜桃视频在线观看网站| 欧美三片在线视频观看| 欧美三级黄色大片| 成人午夜电影久久影院| 国产极品粉嫩福利姬萌白酱 | 亚洲激情电影中文字幕| 在线视频一区二区三区四区| 中文在线免费一区三区高中清不卡| 一起操在线视频| 激情综合久久| 欧洲精品在线一区| 国产精品久久久久久久久久辛辛| 欧美情侣性视频| 男女污视频在线观看| 欧美精品日韩一区| 国产精品第一页在线观看| 久久综合狠狠综合久久综合88| 亚洲欧洲日本精品| 亚洲午夜久久久久久尤物 | 久蕉在线视频| 欧美一卡在线观看| 无码人妻精品一区二区三区蜜桃91 | 91欧美日韩一区| 国内激情视频在线观看| 一区二区三区精品99久久 | 亚洲成人精品av| 国产成人自拍偷拍| 一区二区久久久| 久操视频免费看| 国产福利一区在线| 欧美日韩第二页| 欧美三级网页| 日本一区二区三区四区高清视频 | 极品在线视频| 久久视频在线直播| 免费福利在线视频| 亚洲电影在线观看| 国产精品久久久久久久免费看| 精品成人av一区| 美女视频黄免费| 国产精品毛片久久久久久久| 久久人人爽人人人人片| 国产一区在线精品| 在线视频日韩一区| 99在线精品免费视频九九视| 懂色av粉嫩av蜜臀av| 黑人操亚洲人| 精品久久蜜桃| 9l视频自拍蝌蚪9l视频成人| 成人网页在线免费观看| 日韩在线免费| 日本精品视频在线| 岛国片av在线| 欧美国产视频日韩| 免费在线看黄| 色系列之999| 国产小视频免费在线网址| 亚洲第一福利网站| 精品人妻无码一区二区三区蜜桃一| 欧美在线观看一二区| 麻豆成人免费视频| 午夜欧美2019年伦理| 国产精品99精品无码视| 一卡二卡欧美日韩| 精品一区在线观看视频| 亚洲欧洲一区二区在线播放| 国产伦精品一区二区三区视频女| 91麻豆免费在线观看| 亚洲欧美色图视频| 97精品久久久久中文字幕| 亚洲最大视频网| 国产盗摄精品一区二区三区在线 | 中文字幕在线播| 欧美性猛交xxxx| 毛片毛片女人毛片毛片| 精品国产乱码久久久久久天美| 免费无码毛片一区二区app| 亚洲色图.com| 粉嫩av性色av蜜臀av网站| 18欧美亚洲精品| 亚洲一二三四视频| 一区精品在线播放| 欧美亚洲日本在线| 亚洲综合网站在线观看| 国产真实夫妇交换视频| 亚洲va国产天堂va久久en| 国产精品7777777| 一本色道久久综合狠狠躁的推荐| 欧美性猛交xxxx乱大交hd| 在线观看一区二区视频| 中文字幕永久在线观看| 欧美日韩国产一级片| 国产模特av私拍大尺度 | 免费欧美一级片| 成人中文字幕合集| 91精品小视频| 久久精品亚洲精品国产欧美kt∨ | 一区二区三区日韩欧美精品| 久久久久久激情| 精品国产乱码久久久久久婷婷| 99久久久无码国产精品免费蜜柚| 欧美色视频在线| 国产夫绿帽单男3p精品视频| 亚洲国产精品va| 国产乱子伦三级在线播放| 日韩小视频在线观看| 天天色天天射天天综合网| 2019中文字幕全在线观看| 日韩精品免费观看视频| 亚洲va久久久噜噜噜久久天堂| 澳门久久精品| 日韩福利二区| 欧美va天堂在线| 91av在线免费播放| 加勒比av一区二区| 少妇精品无码一区二区三区| 欧美国产一区视频在线观看| 国产这里有精品| 黑人精品xxx一区一二区| ,一级淫片a看免费| 亚洲成人1234| 色欧美激情视频在线| 欧美高清不卡在线| 78精品国产综合久久香蕉| 成人国产一区二区| 欧美精品一区二区三区精品| 久久av高潮av| 秋霞av亚洲一区二区三| 黄色激情在线观看| 国产精品五月天| 日本熟伦人妇xxxx| 欧美猛男超大videosgay| 色呦呦中文字幕| 久久久国产精品视频| 91精品论坛| av蓝导航精品导航| 日韩一区二区在线免费| 欧美一级免费播放| 黄色精品一二区| 国产美女免费网站| 亚洲综合免费观看高清完整版| 最近中文字幕免费在线观看| 亚洲第一视频网站| av中文字幕在线观看| 国产精品成人一区二区三区吃奶| 国内自拍欧美| 国产成人亚洲综合无码| 久久精品国产999大香线蕉| 亚洲天堂美女视频| 一卡二卡欧美日韩| 99久久精品免费看国产交换| 伊人伊成久久人综合网小说| a在线视频v视频| 97人人模人人爽视频一区二区| 成人黄色av| 97公开免费视频| 91亚洲精品久久久蜜桃网站| 久久久久久久极品内射| 91精品欧美福利在线观看| av黄色在线观看| 国产成人综合一区二区三区| 天天操综合520| 9久久9毛片又大又硬又粗| 成人午夜精品在线| 久久久久久久久久久久久久久久久 | 久久这里有精品| 国产精品久久久久77777丨| 免费一区二区三区在在线视频| 亚洲欧洲午夜| 99久久免费看精品国产一区| 亚洲一线二线三线视频| 精品人妻无码一区二区| 九九视频这里只有精品| 精品国产一区二区三区2021| 日本一本草久p| 国产一区二区不卡在线| 久草综合在线视频| 日韩一区二区三区四区| 肉体视频在线| 国产精品久久精品国产 | 91小视频网站| 国产精品污www在线观看| 国产又粗又猛又爽又| 国产亚洲美女精品久久久| 日本欧美韩国| 亚洲人成人77777线观看| 男男成人高潮片免费网站| 国产日韩精品中文字无码| 51午夜精品国产| 啦啦啦中文在线观看日本| 国产视频精品网| 久久激情中文| 永久免费观看片现看| 欧美顶级少妇做爰| www在线看| 欧美日韩免费观看一区| 免费在线视频一区| 黄色一级大片在线免费观看| 日韩欧美黄色影院| heyzo高清中文字幕在线| 麻豆亚洲一区| 久久精品99国产精品日本| 青青青在线视频| 国产视频久久久久| 狂野欧美性猛交xxxx| 中文精品无码中文字幕无码专区 | 精品人体无码一区二区三区| 欧美高清视频www夜色资源网| 天堂av在线电影| 欧美裸体网站| 精品亚洲免费视频| 日韩免费一二三区| 亚洲无线码在线一区观看| 成人自拍视频| 欧美色图另类小说| 国产精品第五页| 欧美一级一区二区三区| 国产成人午夜视频网址| 欧美黄色一区| 国产女主播喷水高潮网红在线| 欧美精品1区2区| 超碰国产一区| 亚洲色图都市激情| 久久理论电影网| 亚洲av色香蕉一区二区三区| 青草青草久热精品视频在线网站| 91偷拍一区二区三区精品| aaaaa一级片| 日韩欧美一区在线观看| 免费看av不卡| 欧美高清中文字幕|