在一篇“启示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 进行分布式查询、更新,从而建立比较大型、快速的服务器集群。
————————————————
版权声明:本文为CSDN博主「云端漫步」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/coorz/article/details/6789016