Объясните разницу в доступе к SharedPreferences на разных устройствах Android - PullRequest
3 голосов
/ 10 ноября 2011

Я пытаюсь отладить экстремальные различия в производительности для пользователей моего приложения для Android.Я проследил это до крайних различий во времени записи БД и времени чтения и записи SharedPreferences.

Вот 7 тестов производительности, которые я написал для проверки скорости SharedPreferences:

private void testEditor1() {
    SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("testEditor1", true);   
    editor.commit();
}

private void testEditor2() {
    for (int i = 0; i < 10; i++) {
        SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("testEditor2", true);   
        editor.commit();
    }
}

private void testEditor3() {
    SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putInt("testEditor3", 1);   
    editor.commit();
}

private void testEditor4() {
    for (int i = 0; i < 10; i++) {
        SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("testEditor4", i);   
        editor.commit();
    }
}

private void testEditor5() {
    for (int i = 0; i < 100; i++) {
        SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("testEditor5", i);   
        editor.commit();
    }
}

private void testEditor6() {
    SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
    for (int i = 0; i < 10; i++) {
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("testEditor6", i);   
        editor.commit();
    }
}

private void testEditor7() {
    SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
    for (int i = 0; i < 100; i++) {
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("testEditor7", i);   
        editor.commit();
    }
}

На моем устройстве (оригинальный дроид Motorola), вот результаты:

Test 1 (Write 1 bool): 21 ms
Test 2 (Write 10 bools): 316 ms
Test 3 (Write 1 int): 15 ms
Test 4 (Write 10 ints): 182 ms
Test 5 (Write 100 ints): 1525 ms
Test 6 (Write 10 ints 2): 108 ms
Test 7 (Write 100 ints 2): 1378 ms

На устройстве моего коллеги (HTC Evo) вот результаты:

Test 1 (Write 1 bool): 63 ms
Test 2 (Write 10 bools): 14 ms
Test 3 (Write 1 int): 15 ms
Test 4 (Write 10 ints): 186 ms
Test 5 (Write 100 ints): 919 ms
Test 6 (Write 10 ints 2): 60 ms
Test 7 (Write 100 ints 2): 823 ms

На одном из устройств нашего бета-пользователя, Samsung Galaxy S, вот результаты:

Test 1 (Write 1 bool): 1188 ms
Test 2 (Write 10 bools): 1024 ms
Test 3 (Write 1 int): 105 ms
Test 4 (Write 10 ints): 1019 ms
Test 5 (Write 100 ints): 8142 ms
Test 6 (Write 10 ints 2): 630 ms
Test 7 (Write 100 ints 2): 6610 ms

Мы видим медленное время доступа для чтения и записи.Эти цифры в целом соответствуют устройствам.Медленная запись в SharedPreferences на нашем бета-устройстве пользователя в некоторых случаях, по-видимому, занимает ~ 10 секунд (10000 мс) для записи одного логического значения, когда я проверяю наши процессы запуска.

Может кто-нибудь предположить, почему SharedPreferences работают намного медленнее на Samsung Galaxy S?Есть статей о «отставании» на Samsung Galaxy S в интернете;это объяснит поведение SharedPreferences, которое мы видим?Если так, то кто-нибудь возражает объяснить, как именно?

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Запись на диск идет медленно на стандартной Galaxy S. Общие настройки сохраняются на диск, как и файлы БД. Соедините точки:)

0 голосов
/ 23 марта 2017

Мне кажется, что каждый раз, когда происходит фиксация SharedReference, Android открывает новый OutputStream для записи в файл и затем закрывает его. Исходный код должен быть изменен так:

private void testEditor6() {
    SharedPreferences settings = this.getSharedPreferences(Constants.PrefsName, 0);
    for (int i = 0; i < 10; i++) {
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("testEditor6", i);   
       //editor.commit();
    }
     editor.commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...