Android中SharedPreferences提交数据效率的调研

在浏览器客户端数据初始化数据优化时过程中,由于多次看到使用SharedPreferences保存数据。于是查了下客户端的SharedPreferencesManager的源码,发现我们提交数据时的代码形式如下:

 
  1. publicvoidputFloat(Stringkey,floatvalue)
  2. {
  3. editor.putFloat(key,value);
  4. editor.commit();
  5. }

即我们每次都使用事务提交数据,这样操作对客户端来说是很安全的,能确保每次数据能够及时写入,但是,由此也带来了一个小问题,那就是commit操作本身耗时时间时比较长的,多次commit必然会带来时间和性能上的比较大的开销。客户端做了一个Demo来调研该设想,代码如下:

1.每次使用commit提交数据,循环50次,每次提交3条数据

 
  1. button.setOnClickListener(newOnClickListener(){
  2. @Override
  3. publicvoidonClick(Viewv){
  4. SharedPreferenceManagermanager=SharedPreferenceManager.getInstance();
  5. LongstartTime=Calendar.getInstance().getTimeInMillis();
  6. Log.e("start","~"+startTime);
  7. for(inti=0;i<50;i++){
  8. manager.putIntCom("first"+i,1);
  9. manager.putIntCom("second"+i,2);
  10. manager.putIntCom("third"+i,3);
  11. }
  12. //manager.commit();
  13. LongendTime=Calendar.getInstance().getTimeInMillis();
  14. Log.e("endTime","~"+endTime);
  15. Log.e("time---->",""+(endTime-startTime));
  16. Log.e("average",""+(endTime-startTime)/50);
  17. }
  18. });

manager.putIntCom的方法如下:

 
  1. publicvoidputIntCom(Stringkey,intvalue){
  2. editor.putInt(key,value);
  3. editor.commit();
  4. }


来看日志:

 
  1. 04-0503:38:54.224:E/start(9713):~1333597134230
  2. 04-0503:38:55.024:D/dalvikvm(9713):GC_FOR_MALLOCfreed2463objects/413552bytesin107ms
  3. 04-0503:38:55.774:D/dalvikvm(9713):GC_FOR_MALLOCfreed1698objects/566968bytesin89ms
  4. 04-0503:38:56.724:D/dalvikvm(9713):GC_FOR_MALLOCfreed1678objects/507304bytesin48ms
  5. 04-0503:38:58.254:D/dalvikvm(9713):GC_FOR_MALLOCfreed1600objects/529256bytesin45ms
  6. 04-0503:39:00.273:D/dalvikvm(9713):GC_FOR_MALLOCfreed1623objects/505208bytesin44ms
  7. 04-0503:39:01.264:D/dalvikvm(9713):GC_FOR_MALLOCfreed1600objects/529216bytesin46ms
  8. 04-0503:39:01.554:D/dalvikvm(9713):GC_FOR_MALLOCfreed1623objects/505152bytesin47ms
  9. 04-0503:39:01.874:D/dalvikvm(9713):GC_FOR_MALLOCfreed1600objects/529216bytesin45ms
  10. 04-0503:39:02.094:E/endTime(9713):~1333597142101
  11. 04-0503:39:02.094:E/time---->(9713):7871
  12. 04-0503:39:02.094:E/average(9713):157

日志的最后一条显示:平均提交耗时约为157毫秒,当然这里每次提交3条记录,那么每次commit大概耗时52毫秒

2.采用先提交,最后一次性commit方法

 
  1. button.setOnClickListener(newOnClickListener(){
  2. @Override
  3. publicvoidonClick(Viewv){
  4. SharedPreferenceManagermanager=SharedPreferenceManager.getInstance();
  5. LongstartTime=Calendar.getInstance().getTimeInMillis();
  6. Log.e("start","~"+startTime);
  7. for(inti=0;i<50;i++){
  8. manager.putInt("first"+i,1);
  9. manager.putInt("second"+i,2);
  10. manager.putInt("third"+i,3);
  11. }
  12. manager.commit();
  13. LongendTime=Calendar.getInstance().getTimeInMillis();
  14. Log.e("endTime","~"+endTime);
  15. Log.e("time---->",""+(endTime-startTime));
  16. Log.e("average",""+(endTime-startTime)/50);
  17. }
  18. });

Manager.putInt()方法形如:

 
  1. publicvoidputInt(Stringkey,intvalue)
  2. {
  3. editor.putInt(key,value);
  4. }

日志如下:

 
  1. 04-0503:36:46.214:E/start(9167):~1333597006214
  2. 04-0503:36:46.244:E/endTime(9167):~1333597006253
  3. 04-0503:36:46.244:E/time---->(9167):39
  4. 04-0503:36:46.254:E/average(9167):0

这里显示的数据很让人吃惊!

我们来查下Sharedpreferences的实现方式

 
  1. privatestaticfinalclassSharedPreferencesImplimplementsSharedPreferences

在实现putXxx时使用其内部的Map缓存,将数据保存在Map中,当commit时,遍历Map,将数据通过其监听器Listeners提示更新数据文件。

 
  1. listener.onSharedPreferenceChanged(SharedPreferencesImpl.this,key);

默认情况下,我们没有重写onSharedPreferenceChanged方法,这里就交由Android本身去实现了。但是可以确定的是commit方法涉及到同步,遍历等操作,本身是比较耗时的。
所以减少commit操作本身就是一件可以优化的事情。

结论:
Commit操作本身比较耗时,在保证数据安全的情况下,在数据实时性要求不高的地方,可以尽量累计更改,一次提交,以提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值