您的位置:首页 > 编程语言 > Java开发

Java Map的再深入研究(百万级数据测试)

2011-09-19 09:58 435 查看
 
     在一篇“启示4:用HashMap提高内存查询速度”的文章中介绍了利用Map提高查询速度的方法,对于查找字符串的value时,此方法大大提高了程序的运行速度。但是你可能想不到的另一项Map的用处:对于key值落于一定范围内的数据更新操作。有意思的是,经过测试,在Amd(双核)+win7(后面称为‘环境1’) 与Intel(双核)+winxp(后面称为‘环境2’) 这2中环境中的测试结果截然不同。欢迎有兴趣的同仁加入测试,并给出解释过程。并发送到coorz@126.com

    在这次测试中,主要关注key值在一定范围内的HashMap插入情况。

    测试java类:

import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Hashtable;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.TreeMap;

public class MapListCompare {

 private static int maxNum = 1000000;

 

 public static void main( String[] args){

  Long tempTimeVar = System.currentTimeMillis();

  List< Integer > list = new ArrayList< Integer >();

  Map< Integer , Integer > map = new HashMap< Integer, Integer >();

  Set< Integer > set = new HashSet< Integer >();

  Integer[] array = new Integer[maxNum];

  int i ;

  for ( i = 0 ; i < maxNum ; i++ ){

   array[ i ] = i;

  }

  System.out.println( "Array creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

  tempTimeVar = System.currentTimeMillis();

  for ( i = 1 ; i <= maxNum ; i++ ){

   list.add( i );

  }

  System.out.println( "List creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

  tempTimeVar = System.currentTimeMillis();

  for ( i = 1 ; i <= maxNum ; i++ ){

   map.put( i , i);

  }

  System.out.println( "Map creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

  tempTimeVar = System.currentTimeMillis();

  for ( i = 1 ; i <= maxNum ; i++ ){

   set.add( i );

  }

  System.out.println( "Set creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

  //第二次测试

  tempTimeVar = System.currentTimeMillis();

  for ( i = 0 ; i < maxNum ; i++ ){

   array[ i ] = i;

  }

  System.out.println( "Array Re-Creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

  

  tempTimeVar = System.currentTimeMillis();

  list.clear();

  for ( i = 1 ; i <= maxNum ; i++ ){

   list.add( i );

  }

  System.out.println( "List Re-Creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

  tempTimeVar = System.currentTimeMillis();

  for ( i = 1 ; i <= maxNum ; i++ ){

   map.put( i , i );

  }

  System.out.println( "Map Re-Creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

  tempTimeVar = System.currentTimeMillis();

  set.clear();

  for ( i = 1 ; i <= maxNum ; i++ ){

   set.add( i );

  }

  System.out.println( "Set Re-Creator used time(ms):" + ( System.currentTimeMillis() - tempTimeVar ) );

  

 }

}

 

测试结果:

环境1:

结果1:

Array creator used time(ms):218

List creator used time(ms):330

Map creator used time(ms):842

Set creator used time(ms):734

Array Re-Creator used time(ms):219

List Re-Creator used time(ms):296

Map Re-Creator used time(ms):469

Set Re-Creator used time(ms):577

结果2:

Array creator used time(ms):250

List creator used time(ms):313

Map creator used time(ms):827

Set creator used time(ms):656

Array Re-Creator used time(ms):187

List Re-Creator used time(ms):328

Map Re-Creator used time(ms):516

Set Re-Creator used time(ms):608

结果3:

Array creator used time(ms):234

List creator used time(ms):328

Map creator used time(ms):780

Set creator used time(ms):681

Array Re-Creator used time(ms):296

List Re-Creator used time(ms):352

Map Re-Creator used time(ms):531

Set Re-Creator used time(ms):655

环境2:

结果1:
Array creator used time(ms):156

List creator used time(ms):328

Map creator used time(ms):750

Set creator used time(ms):985

Array Re-Creator used time(ms):31

List Re-Creator used time(ms):453

Map Re-Creator used time(ms):109

Set Re-Creator used time(ms):469
 
结果2:
Array creator used time(ms):157

List creator used time(ms):328

Map creator used time(ms):750

Set creator used time(ms):984

Array Re-Creator used time(ms):31

List Re-Creator used time(ms):453

Map Re-Creator used time(ms):110

Set Re-Creator used time(ms):469
 
结果3:
Array creator used time(ms):156

List creator used time(ms):328

Map creator used time(ms):750

Set creator used time(ms):985

Array Re-Creator used time(ms):31

List Re-Creator used time(ms):437

Map Re-Creator used time(ms):110

Set Re-Creator used time(ms):468

注:因为测试环境不同,因此我们主要考虑的并非创建速度问题,而是考虑他们之间的差异,即当对于一个创建好的对象进行更新操作时,他们所需要时间的一些差异。此处测试没有对map进行优化。此处采用环境2的结果,实际效果要在具体环境中进行测试。
结论:
虽然环境1和环境2 有很大区别,但是我们只考虑环境2的情况,至于为什么会出现这种情况,有待进一步测试与分析。
经过测试,不论创建速度还是更新速度,数组的效率之高毋庸置疑,但是数组的查询需要利用遍历比较法,因此效率会大幅度降低。
创建速度上,list虽然创建速度很快,但是要重建list时,速度并没有提高。
因为HashSet也是通过key值进行插入操作,对与key值落入一定的范围内的情况,set的效率几乎提高了一倍,但是set对于查询意义不大。
最后来看看Map的效果,map在创建的时候用时较多,因此在利用Map提高查询速度的时候,最好有一个初始化的过程,以减少key值不同时的建立时间。然而因为key值落入一定区间时,其插入速度有大幅度提高,因此再创建Map时,可以尽量考虑增加key值以减少数据更新时间。不过使用map必然增加服务器的内存使用,对于这种情况可以考虑分布式计算,将数据分散在各个不同的服务器上,通过RMI 进行分布式查询、更新,从而建立比较大型、快速的服务器集群。

http://book.51cto.com/art/200904/119915.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息