年前在公司做了從sharedpreferences
到 mmkv 的遷移,所以借這次機會和大家討論一下android儲存優化。
我們為什麼要去做儲存優化?歸根到底,還是sharedpreferences
不太給力:
增量更新導致檔案寫入的時間長。
執行緒安全問題和潛在的anr。
不能跨程序,不過跨程序的使用場景還真不多!
除了sharedpreferences
,我們還可以選擇哪些本地儲存方式呢?
別說,還挺多,有datastore、mmkv和資料庫。
上面說了四種本地資料儲存方式,簡單介紹一下吧。
1. sharedpreferences
這個應該就不用介紹了,大家的老朋友,用於儲存偏好設定。
2. datastore
官方文件:傳送門datastore 也是 android jetpack 中的一員,它是谷歌爸爸用來取締 sharedpreferences 的。
所以,簡單來說,它的作用也是儲存偏好設定,不過,除了鍵值對以外,這位大哥還支援型別化物件。
什麼是型別化物件,就是存物件。
常見的場景就是讀書讀了一半,退出了,需要儲存書id、章節id和進度,不存使用者id的情況,需要使用三個鍵值對,使用封裝好的物件只需要乙個型別。
不過,資料足夠複雜或者多維度的時候請使用資料庫。
3. mmkv
官方文件:傳送們4. sqlite
跟上面哥幾個的定位不太一樣,主要用來物件的持久化儲存。
比如,上面讀書讀一半的場景,舉乙個不太恰當的例子,你希望記錄每個登陸使用者對應的讀書場景,這個時候,偏好設定肯定不太能滿足你的需求,資料庫就登場了。
簡單寫了一段測試**:
測試過程:單個檔案1000次的讀寫和查詢
測試介面,路徑【我的】-【資料儲存】:
單檔案1000次資料寫入的情況:
看到這個結果的時候屬實有點意外,google 推出的 datastore 怎麼就最慢了?
1. sharedpreferences
sharedpreferences
的慢也在情理之中,主要有兩點:
特別是第二點,導致了最終3300ms
的耗時。
2. mmkv
mmkv為什麼這麼快?主要有三點:
資料組織:使用 protobuf 進行資料序列化。
寫入優化:增量更新將 kv 物件加到記憶體末尾,操作這塊記憶體的 linux核心會自動將這部分資料寫入到檔案。
最終的時長是17ms
。
3. sqlite
sqlite 對應的第三方庫為 android jetpack 中的 room,它的慢是因為:
總的而言,當 sharedpreferences 中單個檔案存了很多鍵值對的時候,每次增量更新會導致記憶體中所有鍵值對的重新寫入,而 sqlite 應該是僅需處理當前的物件,所以記憶體也會遠遠小於 sharedpreferences。
4. datastore
datastore 的結果屬實讓所有人都意外。
datastore,谷歌 android jetpack 中的新成員,protobuf 夾持,天之驕子,霍霍一頓操作,效率竟然還不如 sharedpreferences?
這說的過去嗎?顯然說不過去,我簡單看了一下原始碼(有可能不太準確),大概有以下原因:
因為多了乙個開子協程的操作,所以直接導致了10594ms
之久。
對之前的1000次寫入的資料讀取並進行檢驗:
可以看到,datastore
仍然大於sharedpreferences
和mmkv
。
1. sharedpreferences和mmkv
sharedpreferences 和 mmkv 分別是14ms
和12ms
,測試中,有時 sharedpreferences 快,有時 mmkv 快,總的而言,兩個結果差不多。
快的原因是兩者都是直接從記憶體中讀取。
2. sqlite
這次 sqlite 變成最慢的了,耗時達296ms
,因為每次查詢都要從資料庫中查詢。
3. datastore
datastore 仍然沒有那麼快,時間要達到67ms
,相較於 sharedpreferences 和 mmkv,多了乙個從檔案讀取資料到記憶體這個過程,如果優化一下,使用單例模式,應該也可以省略掉這個過程,最終結果應該跟上面二位差不多。
除了效率以外,下面是谷歌給出的關於 datastore 的**:
與 mmkv 相比,datastore 的優點是:
但是 mmkv 的優點:
所以總結下來就是:
資料集大或者維度多選 sqlite。
本地資料儲存少直接用 sharedpreferences。
實在要換就 mmkv,datastore 才 alpha,mmkv 已經發布多年,品質***。
當然,肯定還有很多同學在使用sharedpreferences
,可以給出的一些建議是:
偏好設定少的情況可以使用單例,資料讀取快。
偏好設定多的情況可以根據模組拆分多個檔案,資料量大還是挺耗記憶體的。
複雜資料請用資料庫。
Android資料儲存
android中一共提供了4種資料儲存方式 shared preferences 用來儲存 key value paires 格式的資料,它是乙個輕量級的鍵值儲存機制,只可以儲存基本資料型別。files 他通過fileinputstream和fileoutputstream對檔案進行操作。但是在an...
Android資料儲存
1.五種儲存方式 android作業系統提供了一種公共檔案系統,即任何應用軟體都可以使用它來儲存和讀取檔案,該檔案被其他的應用軟體讀取。android採用了一種不同的系統,在android中,所有的應用軟體資料 為應用軟體私有,然而,android也提供了一種標準方式 用軟體將私有資料開放給其他應用...
android 資料儲存
sharedpreferences xml檔案儲存 一 根據context獲取sharedpreferences物件 二 利用edit 方法獲取editor物件。三 通過editor物件儲存key value鍵值對資料。四 通過commit 方法提交資料。sharedpreferences sp c...