首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

由HashMap的遍历瞧android的优化

2012-11-07 
由HashMap的遍历看android的优化android的程序编写大部分时候都是用java,而android设备的性能多不是很高,

由HashMap的遍历看android的优化
android的程序编写大部分时候都是用java,而android设备的性能多不是很高,所以对代码的优化是十分重要的,其中许多的优化技巧是可以从以往的PC平台JAVA优化技巧借鉴的。但是由于PC平台和嵌入式平台的硬件架构的巨大区别,导致盲目的采用以往的JAVA经验来优化android的代码可能会产生适得其反的后果。

  本文将就HashMap的遍历对这个问题进行一个初步的讨论。47K是新手程序猿,因此写的东西难免有所错漏,请您不吝赐教

  HashMap的遍历主要由两种方式:

  Solution I

Java code
Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) {     Object key = iter.next();     Object val = map.get(key); } 


  Solution II
Java code
Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) {     Object key = iter.next();     Object val = map.get(key); }


在PC平台上,Solution I确实比II慢了不少

用时情况如下

KeySet 727
EntrySet 354

测试代码如下:
Java code
import java.io.ObjectInputStream.GetField;import java.util.HashMap;import java.util.Iterator;/**    * @Title: test.java  * @Package   * @Description: TODO(用一句话描述该文件做什么)  * @author no47wk      lotp,Come back  * @date 2012-7-14 上午11:02:23  * @version V1.0     *//** * @ClassName: test * @Description: TODO(这里用一句话描述这个类的作用) * @author no47wk lotp,Come back * @date 2012-7-14 上午11:02:23 */public class test {    public static void main(String[] args) {        test t=new test();        t.KeySet();        t.EntrySet();    }    private void KeySet() {        HashMap<String, String> map = getData();        Iterator<String> ite = map.keySet().iterator();        long start = System.currentTimeMillis();        while (ite.hasNext()) {            map.get(ite.next());        }        long end = System.currentTimeMillis();        long time = end - start;        System.out.println("KeySet " + time + "");    }    private void EntrySet() {        HashMap<String, String> map = getData();        Iterator<java.util.Map.Entry<String, String>> ite = map.entrySet()                .iterator();        java.util.Map.Entry<String, String> entry;        long start = System.currentTimeMillis();        while (ite.hasNext()) {            entry = ite.next();            entry.getKey();            entry.getValue();        }        long end = System.currentTimeMillis();        long time = end - start;        System.out.println("EntrySet " + time + "");    }    private HashMap<String, String> getData() {        HashMap<String, String> ret = new HashMap<String, String>();        int i = 0;        while (i < 10000000) {            ret.put(String.valueOf(i), "a");            i++;        }        return ret;    }}


但是在android平台上,两种方法的测试结果就非常接近了,甚至大部分情况下Solution I还比II更快一点,

用时情况如下

KeySet 5585
EntrySet 6515

测试代码如下
Java code
/**    * @Title: Test.java  * @Package com.lotp.Test  * @Description: TODO(用一句话描述该文件做什么)  * @author no47wk      lotp,Come back  * @date 2012-7-14 上午10:43:22  * @version V1.0     */package com.lotp.Test;import java.util.HashMap;import java.util.Iterator;import android.app.Activity;import android.os.Bundle;import android.os.DropBoxManager.Entry;import android.util.Log;/** * @ClassName: Test * @Description: TODO(这里用一句话描述这个类的作用) * @author no47wk lotp,Come back * @date 2012-7-14 上午10:43:22 */public class Test extends Activity {    private HashMap<String, String> map;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        long start = System.currentTimeMillis();        map = getData();        KeySet();        EntrySet();    }    private void KeySet(){        Iterator<String> ite = map.keySet().iterator();        long start=System.currentTimeMillis();        while (ite.hasNext()) {            map.get(ite.next());        }        long end = System.currentTimeMillis();        Log.d("KeySet", end - start + " ");    }    private void EntrySet(){        Iterator<java.util.Map.Entry<String, String>> ite=map.entrySet().iterator();        java.util.Map.Entry<String, String> entry;        long start=System.currentTimeMillis();        while(ite.hasNext()){            entry=ite.next();            entry.getKey();            entry.getValue();        }        long end=System.currentTimeMillis();        Log.d("EntrySet", end-start+"");    }    private HashMap<String, String> getData() {        HashMap<String, String> ret = new HashMap<String, String>();        int i = 0;        while (i < 102400) {            ret.put(String.valueOf(i), "a");            i++;        }        return ret;    }} 



可见,对不同平台的代码的优化应该是因地制宜,强调针对性的,而不能笼统的采用同样的思路

[解决办法]
这个和多线程有关

J2se部分的代码,只有一个主线程在跑

而在android模拟器里:
1.因为包含图形界面,模拟器本身就慢
2.模拟器需要加载整个android系统,需要模拟多进程,然后再你这个程序的进程里又是多线程

总的来说。执行速度肯定要慢下来不少。 如果你把 KeySet 和 EntrySet 各自再开线程去执行,花费的时间就更长了

热点排行