2016-05-25 4 views
1

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

答えて

4

問題は、あなたは、メモリ内

SharedPreferenceから値をバック読んでいますさこれまでに作成した

文書によると、

は、(適用)は、直ちに、メモリ内SharedPreferences への変更をコミットしますが、非同期のため、ディスクに

をコミット開始し、メモリ内SharedPreference意志すぐに更新される。

+0

私はちょうど1つのレコードを挿入しようとすると、違いは重要です。 commit()は20msを要し、apply()はすぐに戻ります。驚いたことに、私の場合、レコード数が100000のように非常に多い場合、ほとんどの時間がメモリ共有設定に書き込まれます。 ioに費やされる時間はごくわずかです。データセットの大きさに関係なく、メモリへの書き込みはディスクに書き込むよりもはるかに高速でなければなりません。データセットが小さい場合にのみ当てはまると思われます。 – darklord

関連する問題