安卓到现在为止我遇到了两种for循环方式,而常用的for (int i=0;i<mDatas.size();i++)的方式又可以把mDatas的size提前计算出来,然后再进行循环,所以姑且当做三种。这里对这三种方式的效率进行一个简单的测试。
首先
for (int i=1;i<=100000;i++){ mDatas.add(i); }我们先向mDatas里添加十万条数据,然后再依次循环取出。
方式一:
long start = System.currentTimeMillis(); for (int i=0;i<mDatas.size();i++){ Log.d("i=",mDatas.get(i)+""); } long end = System.currentTimeMillis(); long time = end - start; Log.d("log=","time = "+time+ ",length = "+mDatas.size());来看下循环三次的log
D/log=: time = 1943,length = 100000
D/log=: time = 1947,length = 100000
D/log=: time = 1865,length = 100000
取平均值:time = 1918ms。
方式二:
这里提前计算出了mDatas的size,我们再来看下logint length = mDatas.size(); long start = System.currentTimeMillis(); for (int i=0;i<length;i++){ Log.d("i=",mDatas.get(i)+""); } long end = System.currentTimeMillis(); long time = end - start; Log.d("log=","time = "+time+ ",length = "+mDatas.size());
D/log=: time = 1888,length = 100000
D/log=: time = 1817,length = 100000
D/log=: time = 1908,length = 100000
取平均值:time = 1871ms。
方法三:
long start = System.currentTimeMillis(); for (int i:mDatas){ Log.d("i=",i+""); } long end = System.currentTimeMillis(); long time = end - start; Log.d("log=","time = "+time+ ",length = "+mDatas.size());
再来看下log
D/log=: time = 1848,length = 100000
D/log=: time = 1843,length = 100000
D/log=: time = 1874,length = 100000
取平均值:time = 1855ms;
这里的数组长度为10万,当数组长度增加到100万时测试数据如下
方法一:
D/log=: time = 25831,length = 1000000
D/log=: time = 26365,length = 1000000
D/log=: time = 26640,length = 1000000
取平均值:time = 26279ms。
方法二:
D/log=: time = 21136,length = 1000000
D/log=: time = 23325,length = 1000000
D/log=: time = 23655,length = 1000000
取平均值:time = 22705ms。
方法三:
D/log=: time = 19871,length = 1000000
D/log=: time = 19334,length = 1000000
D/log=: time = 20600,length = 1000000
取平均值:time = 19935ms。
可以看到,方法三优于方法二优于方法三,而且数组的长度越长其差距越明显。
注:此次测试应用环境为android studio,手机为红米note3,其它环境可能有差异。