SharedPreferences.Editorのapply()とcommit()の違いを知りました。 apply()は非同期であり、UIスレッドで実行するのが安全です。 commit()は同期的でUIスレッド上での実行には適していないと言われています。だから私はMainActivityでクリックリスナーで簡単なテストをした:なぜapply()はSharedPreferences.Editorのcommit()より速くないのですか?
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("synced", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
for (int i = 0; i < 100000; ++i) {
editor.putString("index" + i, "index" + i);
}
Log.e("Test", System.nanoTime() + " SYNC ");
editor.commit();
Log.e("Test", System.nanoTime() + " SYNC " + sharedPreferences.getString("index99999", "NULL"));
SharedPreferences sharedPreferences2 = MainActivity.this.getSharedPreferences("asynced", 0);
SharedPreferences.Editor editor2 = sharedPreferences2.edit();
for (int i = 0; i < 100000; ++i) {
editor2.putString("index2" + i, "index2" + i);
}
Log.e("Test", System.nanoTime() + " ASYNC ");
editor2.apply();
Log.e("Test", System.nanoTime() + " ASYNC " + sharedPreferences2.getString("index299999", "NULL"));
、私はそれをいくつかの時間を実行し、このように同じ結果を受け取った:(Iが適用期待してい
05-25 01:11:44.608 16109-16109/darklord.preferencestest E/Test: 1295614410392 SYNC
05-25 01:11:44.667 16109-16109/darklord.preferencestest E/Test: 1295669350041 SYNC index99999
05-25 01:11:45.257 16109-16109/darklord.preferencestest E/Test: 1296262306521 ASYNC
05-25 01:11:45.317 16109-16109/darklord.preferencestest E/Test: 1296317374397 ASYNC NULL
)であることを速くしなければなりませんコミット()、しかし結果は同じであることが判明しました。両方ともUiスレッドで実行するには適していません。それでなぜこれが起こりますか?
EDIT: ログは、私はエミュレータAPIにテストしてい
05-25 01:11:44.608 16109-16109/darklord.preferencestest E/Test: 1295614410392 SYNC
05-25 01:11:44.667 16109-16109/darklord.preferencestest E/Test: 1295669350041 SYNC index99999
05-25 01:11:45.257 16109-16109/darklord.preferencestest E/Test: 1296262306521 ASYNC
05-25 01:11:45.317 16109-16109/darklord.preferencestest E/Test: 1296317374397 ASYNC index249999
する必要があります17
私はちょうど1つのレコードを挿入しようとすると、違いは重要です。 commit()は20msを要し、apply()はすぐに戻ります。驚いたことに、私の場合、レコード数が100000のように非常に多い場合、ほとんどの時間がメモリ共有設定に書き込まれます。 ioに費やされる時間はごくわずかです。データセットの大きさに関係なく、メモリへの書き込みはディスクに書き込むよりもはるかに高速でなければなりません。データセットが小さい場合にのみ当てはまると思われます。 – darklord