中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > JDK核心API
关于Map和List的性能测试报告
作者:未知 时间:2005-07-24 21:14 出处:JR 责编:chinaitpower
              摘要:关于Map和List的性能测试报告
说明:我所涉及到的试验代码,均是针对于1百万条记录,我的硬件配置如下:CPUP4 1.5G,256M DDR的内存。
如果要试验其代码,要采用这种方式运行:java -Xms128M -Xmx250M TestMap
1,对内存容量的要求
   Map对象高于List。因为Map除了Value外还需要一个Object的Key,从而增大了Map的容量。试验代码如下:
  1.    import java.util.*;
  2.     public class TestMap {
  3.         public static void main(String[] args) {        
  4.             System.out.println("begin>>>>>>>>>>>>>>");
  5.             long sm = Runtime.getRuntime().totalMemory();
  6.             System.out.println("Begin Memory :" + sm);
  7.             Map m = new Hashtable();
  8.             //LinkedList tmpList = new LinkedList();
  9.             for (int i=0;i<1000000;i++) {
  10.                 m.put(""+i,"i=" + i);
  11.                 //Integer integer = new Integer(i);
  12.                 //tmpList.add(integer);
  13.             }
  14.             long em = Runtime.getRuntime().totalMemory();
  15.             System.out.println("End Memory :" + em);
  16.             System.out.println("End-Start Memory :" + (em - sm));
  17.             //walkList(tmpList);
  18.             System.out.println("<<<<<<<<<<<<<<<<end");
  19.             //find(m,"985757");
  20.             walkMap(m);
  21.             //List tmpList = new LinkedList();
  22.             //tmpList.addAll(m.values());        
  23.         }
  24.     }

    其对比结果如下:1百万条记录Map大概需要70M额外空间,而List不需要,其额外空间为0
2.遍历比较
    我在试验中,发现我们经常采用遍历List的方式是一个错误的遍历方式,其性能其差无比。我们经常遍历List代码实例如下:
    
  1. for(int i = 0;i<list.size();i++) {
  2.         Object obj = list.get(i);
  3.     }
    
    如果List的遍历方式换一种方式,其性能和Map差不多,我们将上面的代码进行扩充,从而来比较Map和List的遍历速度:
  
  1.   import java.util.*;
  2.     /**
  3.     * @author whxu 
  4.     * @version 1.0.0 2003-4-22 AM
  5.     */
  6.     public class TestMap {    
  7.         public static void main(String[] args) {        
  8.             System.out.println("begin>>>>>>>>>>>>>>");
  9.             long sm = Runtime.getRuntime().totalMemory();
  10.             System.out.println("Begin Memory :" + sm);
  11.             Map m = new Hashtable();
  12.             //LinkedList tmpList = new LinkedList();
  13.             for (int i=0;i<1000000;i++) {
  14.                 m.put(""+i,"i=" + i);
  15.                 //Integer integer = new Integer(i);
  16.                 //tmpList.add(integer);
  17.             }
  18.             long em = Runtime.getRuntime().totalMemory();
  19.             System.out.println("End Memory :" + em);
  20.             System.out.println("End-Start Memory :" + (em - sm));
  21.             //walkList(tmpList);
  22.             System.out.println("<<<<<<<<<<<<<<<<end");
  23.             //find(m,"985757");
  24.             walkMap(m);
  25.             //List tmpList = new LinkedList();
  26.             //tmpList.addAll(m.values());        
  27.         }
  28.         public static void find(Map m,String key) {
  29.             long st = System.currentTimeMillis();
  30.             Object obj = m.get(key);
  31.             System.out.println("Object:" + obj);
  32.             long et = System.currentTimeMillis();
  33.             System.out.println("Start Time:" + st);
  34.             System.out.println("End Time:" + et);
  35.             System.out.println("Use Time:" + (et - st));
  36.         }    
  37.         public static void walkMap(Map m) {
  38.             long st = System.currentTimeMillis();
  39.             for(Iterator it = m.values().iterator();it.hasNext();) {
  40.                 Object obj = it.next();
  41.             }
  42.             long et = System.currentTimeMillis();
  43.             System.out.println("WalkMap Start Time:" + st);
  44.             System.out.println("WalkMap End Time:" + et);
  45.             System.out.println("WalkMap Use Time:" + (et - st));
  46.         }
  47.         public static void walkList(LinkedList l) {
  48.             long st = System.currentTimeMillis();
  49.             Object obj = null;
  50.             //System.out.println(l.get(3434));
  51.             /*这种遍历方式的性能其差无比,建议不要使用
  52.             for(int i=0;i<l.size();i++) {            
  53.                 obj = l.get(i);
  54.             }
  55.             */
  56.             for(Iterator it = l.iterator();it.hasNext();) {
  57.                 obj = it.next();
  58.             }
  59.             long et = System.currentTimeMillis();
  60.             System.out.println("WalkList Start Time:" + st);
  61.             System.out.println("WalkList End Time:" + et);
  62.             System.out.println("WalkList Use Time:" + (et - st));
  63.         }
  64.     }

3.随机查找。如果Map知道了Key,List知道了index,其性能在一百万条数据中无多大差别。其实例代码如下:
  1.     import java.util.*;
  2.     /**
  3.     * @author whxu 
  4.     * @version 1.0.0 2003-4-22 AM
  5.     */
  6.     public class TestMap
  7.     {
  8.         public static void main(String[] args) 
  9.         {
  10.             System.out.println("begin>>>>>>>>>>>>>>");
  11.             long sm = Runtime.getRuntime().totalMemory();
  12.             System.out.println("Begin Memory :" + sm);
  13.             Map m = new Hashtable();
  14.            LinkedList tmpList = new LinkedList();
  15.             for (int i=0;i<1000000;i++) {
  16.                 //m.put(""+i,"i=" + i);            
  17.                 tmpList.add("i=" + i);
  18.             }
  19.             long em = Runtime.getRuntime().totalMemory();
  20.             System.out.println("End Memory :" + em);
  21.             System.out.println("End-Start Memory :" + (em - sm));
  22.             //walkList(tmpList);
  23.             System.out.println("<<<<<<<<<<<<<<<<end");
  24.             //find(m,"985757");
  25.             find(tmpList,1000000-1);
  26.             //walkMap(m);
  27.             //List tmpList = new LinkedList();
  28.             //tmpList.addAll(m.values());        
  29.         }
  30.         public static void find(Map m,String key) {
  31.             long st = System.currentTimeMillis();
  32.             Object obj = m.get(key);
  33.             System.out.println("Find Map Object:" + obj);
  34.             long et = System.currentTimeMillis();
  35.             System.out.println("Find Map Start Time:" + st);
  36.             System.out.println("Find Map End Time:" + et);
  37.             System.out.println("Find Map Use Time:" + (et - st));
  38.         }
  39.         public static void find(List l,int index) {
  40.             long st = System.currentTimeMillis();
  41.             Object obj = l.get(index);
  42.             System.out.println("Find List Object:" + obj);
  43.             long et = System.currentTimeMillis();
  44.             System.out.println("Find List Start Time:" + st);
  45.             System.out.println("Find List End Time:" + et);
  46.             System.out.println("Find List Use Time:" + (et - st));
  47.         }
  48.         public static void walkMap(Map m) {
  49.             long st = System.currentTimeMillis();
  50.             for(Iterator it = m.values().iterator();it.hasNext();) {
  51.                 Object obj = it.next();
  52.             }
  53.             long et = System.currentTimeMillis();
  54.             System.out.println("WalkMap Start Time:" + st);
  55.             System.out.println("WalkMap End Time:" + et);
  56.             System.out.println("WalkMap Use Time:" + (et - st));
  57.         }
  58.         public static void walkList(LinkedList l) {
  59.             long st = System.currentTimeMillis();
  60.             Object obj = null;
  61.             //System.out.println(l.get(3434));
  62.             /*for(int i=0;i<l.size();i++) {            
  63.                 obj = l.get(i);
  64.             }
  65.             */
  66.             for(Iterator it = l.iterator();it.hasNext();) {
  67.                 obj = it.next();
  68.             }
  69.             long et = System.currentTimeMillis();
  70.             System.out.println("WalkList Start Time:" + st);
  71.             System.out.println("WalkList End Time:" + et);
  72.             System.out.println("WalkList Use Time:" + (et - st));
  73.         }
  74.     }



关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有