SharedPreferences的读取速度

问题描述 投票:0回答:5

SharedPreferences
有多快?有没有办法将它们放在内存中以供阅读?我有少量数据,
ListView
必须查询才能显示每个单元格,我担心调用闪存会太慢。我不担心写入速度,因为写入很少发生。我正在考虑只使用 JSON 对象来保存数据而不是
SharedPreferences
。有什么想法吗?

android performance sharedpreferences
5个回答
62
投票

有没有办法把它们放在记忆中以便阅读?

它们在内存中,在第一次引用之后。第一次检索特定的

SharedPreferences
(例如,
PreferenceManager.getDefaultSharedPreferences()
)时,数据将从磁盘加载并保存。


19
投票

我的建议是先测试你的性能,然后再开始担心速度。一般来说,您会更喜欢优先考虑可维护性和速度的应用程序。当工程师在让应用程序稳定之前就开始实现性能时,结果是应用程序运行得更快但有很多错误。


13
投票

根据this链接,

getSharedPreferences
并没有那么重,因为它只在您第一次调用
getSharedPreferences
时打开文件:

// There are 1000 String values in preferences

SharedPreferences first = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
// call time = 4 milliseconds

SharedPreferences second = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
// call time = 0 milliseconds

SharedPreferences third = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
// call time = 0 milliseconds

但是使用

get
方法第一次调用需要一些时间:

first.getString("key", null)
// call time = 147 milliseconds

first.getString("key", null)
// call time = 0 milliseconds

second.getString("key", null)
// call time = 0 milliseconds

third.getString("key", null)
// call time = 0 milliseconds 

0
投票

对大文件感兴趣的人的另一个基准。下面的代码片段在 2013(?) 三星 SMT-350 平板电脑(1.2 GHz 四核,高通)上运行显示:

  • 创建 10000 个 7k 字符串大约需要 80 秒
  • “打开”(getSharedPreferences)70mb 文件大约需要 3.5 秒
  • 打开 SP 后读取任何 7k 字符串大约需要 1/10 毫秒

注意:文件创建在 5500 时崩溃,但继续没有问题。我不建议使用 70MB SP,这是为了不太可能的边缘案例测试和 100 倍过度测试。

        G.logTime("MAKE HUGE FILE", true);
        String sevenKString = App.getAsset(this, "sample_map.txt");
        SharedPreferences.Editor spf = getSharedPreferences("TEST", Context.MODE_PRIVATE).edit();
        G.logTime("SP OPEN", false);
        for (Integer i = 0; i < 10000; i++) {
            spf.putString(i.toString(), sevenKString);
            spf.apply();
            G.logTime("SP ADD " + i.toString() + " (" + (7 * i) + ")", false);
        }

        G.logTime("SP OPEN", true);
        SharedPreferences sp = getSharedPreferences("TEST", Context.MODE_PRIVATE);
        for (Integer i = 1; i < 10000; i += 10) {
            file = sp.getString(i.toString(), null);
            G.logTime("SP READ = " + i.toString(), false);
        }

-1
投票

我有少量数据需要 ListView 查询 显示每个单元格

你不能做一个单身人士,一个普通的班级,然后从那里第二次读吗?我会那样做。

© www.soinside.com 2019 - 2024. All rights reserved.