SharedPreferences優(yōu)化總結(jié)

SharedPreferences(后續(xù)簡稱SP)為我們提供了輕量級存儲能力,方便了少量數(shù)據(jù)的持久化。

但是由于項目越來越龐大,SP操作使用不當(dāng)會導(dǎo)致app卡頓,乃至ANR問題恬吕。

下面介紹一下操作SP的優(yōu)化點。


SP性能優(yōu)化點

SP性能變差的原因有很多须床。

1.原生API的限制主要有以下兩方面:

?????(1)IO瓶頸

?????(2)鎖性能差

2.對SP的不當(dāng)封裝也會間接造成數(shù)據(jù)讀寫性能差铐料。

下面會對以上三方面進行分析。


IO瓶頸

IO瓶頸造成SP性能差是最大的原因豺旬,解決了IO瓶頸钠惩,80%的性能問題就解決了。

SP的IO瓶頸包括讀取數(shù)據(jù)到內(nèi)存與數(shù)據(jù)寫入磁盤兩部分族阅。

1.讀取數(shù)據(jù)到內(nèi)存有兩個場景會觸發(fā):

?????(1)SP文件沒有被加載到內(nèi)存時篓跛,調(diào)用getSharedPreferences方法會初始化文件并讀入內(nèi)存。

?????(2)版本低于android_H或使用了MULTI_PROCESS標志時坦刀,每次調(diào)用getSharedPreferences方法時都會讀入愧沟。

? ? ?我們可以優(yōu)化的便是(2)了。每次加載數(shù)據(jù)到內(nèi)存太過影響效率鲤遥。

? ?? H以下版本留存率已經(jīng)很低了沐寺,基本可以忽略。

?????對于MULTI_PROCESS渴频,可以采用ContentProvider等其他方式芽丹,效率更好,而且可避免SP數(shù)據(jù)丟失的情況卜朗。

2.數(shù)據(jù)寫入磁盤也有兩個場景會觸發(fā):

?????(1)Editor的commit方法,每次執(zhí)行時同步寫入磁盤咕村。

?????(2)Editor的apply方法场钉,每次執(zhí)行時在單線程池中加入寫入磁盤Task,異步寫入懈涛。

?????commit和apply的方法區(qū)別在于同步寫入和異步寫入逛万,以及是否需要返回值。

? ?? 在不需要返回值的情況下批钠,使用apply方法可以極大的提高性能宇植。

?????同時,多個寫入操作可以合并為一個commit/apply埋心,將多個寫入操作合并后也能提高IO性能指郁。


鎖性能差

SP的get操作,會鎖定SharedPreferences對象拷呆,互斥其他操作闲坎。

SP的put操作疫粥,getEditor及commitToMemory會鎖定SharedPreferences對象,put操作會鎖定Editor對象腰懂,寫入磁盤更會鎖定一個寫入鎖梗逮。

由于鎖的緣故,SP操作并發(fā)時绣溜,耗時會徒增慷彤。減少鎖耗時,是另一個優(yōu)化點怖喻。

由于讀寫操作的鎖均是針對SP實例對象的底哗,將數(shù)據(jù)拆分到不同的sp文件中,便是減少鎖耗時的直接方案罢防。

降低單文件訪問頻率艘虎,多文件均攤訪問,以減少鎖耗時咒吐。

用開發(fā)機進行了簡單的性能測試(寫入均使用apply野建,若使用commit則多線程耗時更高):

讀寫同一文件,10個線程每個讀寫10次數(shù)據(jù):

耗時80-130ms

讀寫10個文件恬叹,每個文件由1個線程讀寫10次數(shù)據(jù):

耗時30-70ms


對SP操作的不當(dāng)封裝

由于我們項目采用了插件化候生,所以對SP的操作涉及到了跨進程訪問。

我們采用ContentProvider方案支持跨進程訪問绽昼,并對所有SP操作均套上了ContentProvider進行訪問唯鸭。

隨著項目越來越龐大,通過ContentProvider訪問造成的耗時性能也成了問題硅确。

對ContentProvider操作SP測試目溉,耗時是直接操作SP的4倍左右。

所以菱农,最近項目中進行了SP的處理缭付,對于不需要跨進程的SP操作去掉了ContentProvider,盡可能減少無謂耗時循未。


SP優(yōu)化的建議

1.盡量不要直接調(diào)用SharedPreferences進行讀寫操作陷猫。

若直接調(diào)用getSharedPreferences(fileName,mode).edit().putString(key,value),則對數(shù)據(jù)的操作直接耦合了fileName和key的妖,后續(xù)想調(diào)整file和key會比較困難绣檬。

可以考慮封裝一下,譬如:

public void saveUserId(){

? ? ?getSharedPreferences(fileName,mode).edit().putString(“user_id”,value);

}

這樣做可以直接對數(shù)據(jù)訪問嫂粟,而與fileName與key解耦娇未,后續(xù)拆分與調(diào)整時會很方便。

2.將SP作為耗時操作對待赋元,盡量減少無謂的調(diào)用忘蟹。

譬如以下代碼飒房,SP讀一次即可:

if(sp.getUserId()>0){

? ? ?int id=sp.getUserId();

? ? ?...

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市媚值,隨后出現(xiàn)的幾起案子狠毯,更是在濱河造成了極大的恐慌,老刑警劉巖褥芒,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚼松,死亡現(xiàn)場離奇詭異,居然都是意外死亡锰扶,警方通過查閱死者的電腦和手機献酗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坷牛,“玉大人罕偎,你說我怎么就攤上這事【┤颍” “怎么了颜及?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹂楣。 經(jīng)常有香客問我俏站,道長,這世上最難降的妖魔是什么痊土? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任肄扎,我火速辦了婚禮,結(jié)果婚禮上赁酝,老公的妹妹穿的比我還像新娘犯祠。我一直安慰自己,他們只是感情好酌呆,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布雷则。 她就那樣靜靜地躺著,像睡著了一般肪笋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上度迂,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天藤乙,我揣著相機與錄音,去河邊找鬼惭墓。 笑死坛梁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腊凶。 我是一名探鬼主播划咐,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拴念,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了褐缠?” 一聲冷哼從身側(cè)響起政鼠,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎队魏,沒想到半個月后公般,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡胡桨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年官帘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昧谊。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刽虹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呢诬,到底是詐尸還是另有隱情涌哲,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布馅巷,位于F島的核電站膛虫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钓猬。R本人自食惡果不足惜稍刀,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敞曹。 院中可真熱鬧账月,春花似錦、人聲如沸澳迫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橄登。三九已至抓歼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拢锹,已是汗流浹背谣妻。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卒稳,地道東北人蹋半。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像充坑,于是被迫代替她去往敵國和親减江。 傳聞我的和親對象是個殘疾皇子染突,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 面試題總結(jié) 通用 安卓學(xué)習(xí)途徑, 尋找資料學(xué)習(xí)的博客網(wǎng)站 AndroidStudio使用, 插件使用 安卓和蘋果的...
    JingBeibei閱讀 1,677評論 2 21
  • Android 五種數(shù)據(jù)存儲的方式分別為: SharedPreferences:以Map形式存放簡單的配置參數(shù); ...
    ghroost閱讀 12,593評論 0 23
  • 一.sp是什么?能做什么? SharedPreferences(簡稱SP)是Android中很常用的數(shù)據(jù)存儲方式辈灼,...
    lemonCode閱讀 829評論 0 2
  • ——在2001屆二測前的教師月考總結(jié)會上的講話 各位老師: 再有23天就要進行二測了份企,今天開月考總結(jié)會暨二測動員會...
    清水一滴閱讀 381評論 0 1
  • 有一種喜悅叫驚喜,有一種滿意叫滿足茵休,喜歡一種感覺是由內(nèi)而發(fā)的薪棒,很感謝我們的相遇,有你們我很滿足榕莺,愛大家俐芯,愛每一個人!
    王兵Fineyoga閱讀 149評論 0 2