×

由HashMap的遍历看android的优化

Kalet Kalet 发表于2013-12-27 20:26:13 浏览301 评论0

抢沙发发表评论

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

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

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

  Solution I
 

Java code
 
?
1
2
3
4
5
6
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
 
?
1
2
3
4
5
6
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
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**   
 * @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;
    }
}



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

群贤毕至

访客