SharedPreferences访问耗时吗?

时间:2012-09-24 14:29:10

标签: android performance testing sharedpreferences

我目前正在尝试为我的应用测试第三方服务,并且需要确定每次特定运行时正在进行的每项测试。

由于每次运行testApp时都可以进行多次测试,因此我需要识别每个测试。

我想到的是存储设备名称和构建(这里没有很多设备),以及每个测试的索引。

private String getTestId(){
    SharedPreferences settings = getPreferences(0);
    SharedPreferences.Editor editor = settings.edit();
    int testNumber = settings.getInt("id", 0);
    editor.putInt("id", testNumber+1);
    editor.commit();
    String id = Build.DEVICE + Build.VERSION.RELEASE+" - test number: "+testNumber;
    return id;
}

每次运行测试时都会运行此功能,还是可以在不担心海岸的情况下执行此操作?

如果答案是“耗时的”,那么每次我进行测试以区分每项测试时,你会建议我做什么?

3 个答案:

答案 0 :(得分:15)

关于SharedPreferences

第一次加载后,

SharedPreferences缓存,因此磁盘访问加载数据需要一段时间。您可以尝试在测试套件的早期加载SharedPreferences以避免这种惩罚。

要保留您的数据,您应该选择SharedPreferences.Editor.apply()而不是SharedPreferences.Editor.commit(),因为appy是异步的。但是,请阅读有关两者的文档,以了解哪种情况适用于您的情况。

答案 1 :(得分:1)

我注意到,当您第一次使用putInt()等方法处理特定密钥时,可能会花费大量时间。此外,它应该等同于写入文件的任何其他方式。

答案 2 :(得分:1)

这个问题已经有了答案,但是如果其他人来了并且正在寻找代码示例,我将这个实用程序类放在一起以便与SharedPreferences进行交互。

调用commit()将使用apply()方法(如果可用),否则它将在旧设备上默认返回commit():

public class PreferencesUtil {

    SharedPreferences prefs;
    SharedPreferences.Editor prefsEditor;
    private Context mAppContext;
    private static PreferencesUtil sInstance;

    private boolean mUseApply;

    //Set to private
    private PreferencesUtil(Context context) {
        mAppContext = context.getApplicationContext();
        prefs = PreferenceManager.getDefaultSharedPreferences(mAppContext);
        prefsEditor = prefs.edit();

        //Indicator whether or not the apply() method is available in the current API Version
        mUseApply = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD;
    }

    public static PreferencesUtil getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new PreferencesUtil(context);
        }
        return sInstance;
    }

    public boolean getBoolean(String key, boolean defValue) {
        return prefs.getBoolean(key, defValue);
    }

    public int getInt(String key, int defValue) {
        return prefs.getInt(key, defValue);
    }

    public String getString(String key, String defValue) {
        return prefs.getString(key, defValue);
    }

    public String getString(String key) {
        return prefs.getString(key, "");
    }

    public void putBoolean(String key, boolean value) {
        prefsEditor.putBoolean(key, value);
    }

    public void putInt(String key, int value) {
        prefsEditor.putInt(key, value);
    }

    public void putString(String key, String value) {
        prefsEditor.putString(key, value);
    }

    /**
     * Sincle API Level 9, apply() has been provided for asynchronous operations.
     * If not available, fallback to the synchronous commit()
     */
    public void commit() {
        if (mUseApply)
            //Since API Level 9, apply() is provided for asynchronous operations
            prefsEditor.apply();
        else
            //Fallback to syncrhonous if not available
            prefsEditor.commit();
    }
}