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
相关文章推荐
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- Java Map的再深入研究(百万级数据测试)
- JavaWeb开发中Ajax技术、json与java实现List、Map数据直接传递的研究
- JavaWeb开发中Ajax技术、json与java实现List、Map数据直接传递的研究
- JAVA 百万级的数据并发SOCKET编程(已经通过测试)
- JavaWeb开发中Ajax、json与java实现List、Map数据直接传递的研究
- JavaWeb开发中Ajax技术、json与java实现List、Map数据直接传递的研究
- JAVA深入研究——Method的Invoke方法。
- JAVA深入研究——Method的Invoke方法。
- java----基本数据类型精度的研究与使用(char,byte,int等)
- Java中异常机制的深入研究
- Java异常的深入研究与分析