Android資料儲存優化

2021-10-19 18:21:48 字數 3048 閱讀 9539

年前在公司做了從sharedpreferences到 mmkv 的遷移,所以借這次機會和大家討論一下android儲存優化。

我們為什麼要去做儲存優化?歸根到底,還是sharedpreferences不太給力:

增量更新導致檔案寫入的時間長。

執行緒安全問題和潛在的anr。

不能跨程序,不過跨程序的使用場景還真不多!

除了sharedpreferences,我們還可以選擇哪些本地儲存方式呢?

別說,還挺多,有datastoremmkv資料庫

上面說了四種本地資料儲存方式,簡單介紹一下吧。

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仍然大於sharedpreferencesmmkv

1. sharedpreferences和mmkv

sharedpreferences 和 mmkv 分別是14ms12ms,測試中,有時 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...