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

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

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

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


SP性能優(yōu)化點(diǎn)

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

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

?????(1)IO瓶頸

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

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

下面會(huì)對(duì)以上三方面進(jìn)行分析。


IO瓶頸

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

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

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

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

?????(2)版本低于android_H或使用了MULTI_PROCESS標(biāo)志時(shí),每次調(diào)用getSharedPreferences方法時(shí)都會(huì)讀入。

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

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

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

2.數(shù)據(jù)寫入磁盤也有兩個(gè)場(chǎng)景會(huì)觸發(fā):

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

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

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

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

?????同時(shí),多個(gè)寫入操作可以合并為一個(gè)commit/apply,將多個(gè)寫入操作合并后也能提高IO性能。


鎖性能差

SP的get操作,會(huì)鎖定SharedPreferences對(duì)象,互斥其他操作。

SP的put操作,getEditor及commitToMemory會(huì)鎖定SharedPreferences對(duì)象,put操作會(huì)鎖定Editor對(duì)象,寫入磁盤更會(huì)鎖定一個(gè)寫入鎖。

由于鎖的緣故,SP操作并發(fā)時(shí),耗時(shí)會(huì)徒增。減少鎖耗時(shí),是另一個(gè)優(yōu)化點(diǎn)。

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

降低單文件訪問頻率,多文件均攤訪問,以減少鎖耗時(shí)。

用開發(fā)機(jī)進(jìn)行了簡(jiǎn)單的性能測(cè)試(寫入均使用apply,若使用commit則多線程耗時(shí)更高):

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

耗時(shí)80-130ms

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

耗時(shí)30-70ms


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

由于我們項(xiàng)目采用了插件化,所以對(duì)SP的操作涉及到了跨進(jìn)程訪問。

我們采用ContentProvider方案支持跨進(jìn)程訪問,并對(duì)所有SP操作均套上了ContentProvider進(jìn)行訪問。

隨著項(xiàng)目越來越龐大,通過ContentProvider訪問造成的耗時(shí)性能也成了問題。

對(duì)ContentProvider操作SP測(cè)試,耗時(shí)是直接操作SP的4倍左右。

所以,最近項(xiàng)目中進(jìn)行了SP的處理,對(duì)于不需要跨進(jìn)程的SP操作去掉了ContentProvider,盡可能減少無謂耗時(shí)。


SP優(yōu)化的建議

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

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

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

public void saveUserId(){

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

}

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

2.將SP作為耗時(shí)操作對(duì)待,盡量減少無謂的調(diào)用。

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

if(sp.getUserId()>0){

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

? ? ?...

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評(píng)論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,678評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評(píng)論 2 374

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

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