3 Stimmen

Erklären Sie den Unterschied beim Zugriff auf SharedPreferences auf verschiedenen Android-Geräten

Ich versuche, extreme Leistungsunterschiede für Benutzer meiner Android-App zu beheben. Ich habe es auf extreme Unterschiede in der DB-Schreibzeit und SharedPreferences Lese- und Schreibzeit zurückgeführt.

Hier sind 7 Leistungstests, die ich geschrieben habe, um die Geschwindigkeit von SharedPreferences zu testen:

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();
    }
}

Auf meinem Gerät (einem Original Motorola droid) sind die Ergebnisse wie folgt:

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

Auf dem Gerät meines Kollegen (einem HTC Evo) sind die Ergebnisse wie folgt:

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

Auf dem Gerät eines unserer Beta-Benutzer, einem Samsung Galaxy S, sind die Ergebnisse wie folgt:

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

Wir sehen langsame Zugriffszeiten sowohl beim Lesen als auch beim Schreiben. Diese Zahlen sind im Allgemeinen bei allen Geräten gleich. Die langsamen Schreibvorgänge auf SharedPreferences auf dem Gerät unserer Beta-Benutzer scheinen in einigen Fällen ~10 Sekunden (10000 ms) für einen einzelnen booleschen Wert zu dauern, wenn ich unsere Startprozesse untersuche.

Kann jemand eine Hypothese aufstellen, warum SharedPreferences auf einem Samsung Galaxy S so viel langsamer arbeitet? Es gibt Artikel über der "Rückstand" auf Samsung Galaxy S's aus dem Internet; würde dies erklären, die SharedPreferences Verhalten wir sehen? Wenn ja, würde jemand Geist erklären, genau wie?

Danke!

1voto

Nikolay Elenkov Punkte 52201

Das Schreiben auf die Festplatte ist auf einem Galaxy S langsam. Gemeinsame Einstellungen werden auf der Festplatte gespeichert, ebenso wie DB-Dateien. Verbinden Sie die Punkte :)

0 Stimmen

Meines Wissens war der interne Speicher wesentlich schneller - wir reden hier nicht von Festplatten. Es ist mir auch unklar, warum das Samsung Galaxy S so viel schlechter ist, und außerdem, wie irgendwelche Apps angesichts der Erfahrungen mit unseren Apps gut abschneiden sollen.

0 Stimmen

Sie können es langsam machen, auch wenn es keine Festplatte ist :) Die Langsamkeit wird durch Samsungs Designentscheidungen verursacht: Sie verwenden das eigene RFS-Dateisystem in Kombination mit einem so genannten "intelligenten" Speicher-Controller. Die Details dazu finden Sie online. Das Einzige, was Sie in Ihrer Anwendung tun können, ist sicherzustellen, dass alle E/A-Operationen in einem separaten Thread ausgeführt werden, damit die Verzögerung weniger sichtbar ist.

0voto

HungNM2 Punkte 2050

Ich scheine wie jedes Mal überträgt auf SharedReference, Android öffnen einen neuen OutputStream in die Datei zu schreiben, dann schließen Sie es. der Quellcode sollte wie folgt geändert werden:

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();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X