服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

关于map和list的性能测试报告


  说明:我所涉及到的试验代码,均是针对于1百万条记录,我的硬件配置如下:cpup4 1.5g,256m ddr的内存。
如果要试验其代码,要采用这种方式运行:java -xms128m -xmx250m testmap
1,对内存容量的要求
map对象高于list。因为map除了value外还需要一个object的key,从而增大了map的容量。试验代码如下:

import java.util.*;
public class testmap {
public static void main(string[] args) {
system.out.println("begin>>>>>>>>>>>>>>");
long sm = runtime.getruntime().totalmemory();
system.out.println("begin memory :" + sm);
map m = new hashtable();
//linkedlist tmplist = new linkedlist();
for (int i=0;i<1000000;i++) {
m.put(""+i,"i=" + i);
//integer integer = new integer(i);
//tmplist.add(integer);
}
long em = runtime.getruntime().totalmemory();
system.out.println("end memory :" + em);
system.out.println("end-start memory :" + (em - sm));
//walklist(tmplist);
system.out.println("<<<<<<<<<<<<<<<<end");
//find(m,"985757");
walkmap(m);
//list tmplist = new linkedlist();
//tmplist.addall(m.values());
}
}

其对比结果如下:1百万条记录map大概需要70m额外空间,而list不需要,其额外空间为0
2.遍历比较
我在试验中,发现我们经常采用遍历list的方式是一个错误的遍历方式,其性能其差无比。我们经常遍历list代码实例如下:

for(int i = 0;i<list.size();i++) {
object obj = list.get(i);
}

如果list的遍历方式换一种方式,其性能和map差不多,我们将上面的代码进行扩充,从而来比较map和list的遍历速度:

import java.util.*;
/**
* @author whxu
* @version 1.0.0 2003-4-22 am
*/
public class testmap {
public static void main(string[] args) {
system.out.println("begin>>>>>>>>>>>>>>");
long sm = runtime.getruntime().totalmemory();
system.out.println("begin memory :" + sm);
map m = new hashtable();
//linkedlist tmplist = new linkedlist();
for (int i=0;i<1000000;i++) {
m.put(""+i,"i=" + i);
//integer integer = new integer(i);
//tmplist.add(integer);
}
long em = runtime.getruntime().totalmemory();
system.out.println("end memory :" + em);
system.out.println("end-start memory :" + (em - sm));
//walklist(tmplist);
system.out.println("<<<<<<<<<<<<<<<<end");
//find(m,"985757");
walkmap(m);
//list tmplist = new linkedlist();
//tmplist.addall(m.values());
}
public static void find(map m,string key) {
long st = system.currenttimemillis();
object obj = m.get(key);
system.out.println("object:" + obj);
long et = system.currenttimemillis();
system.out.println("start time:" + st);
system.out.println("end time:" + et);
system.out.println("use time:" + (et - st));
}
public static void walkmap(map m) {
long st = system.currenttimemillis();
for(iterator it = m.values().iterator();it.hasnext();) {
object obj = it.next();
}
long et = system.currenttimemillis();
system.out.println("walkmap start time:" + st);
system.out.println("walkmap end time:" + et);
system.out.println("walkmap use time:" + (et - st));
}
public static void walklist(linkedlist l) {
long st = system.currenttimemillis();
object obj = null;
//system.out.println(l.get(3434));
/*这种遍历方式的性能其差无比,建议不要使用
for(int i=0;i<l.size();i++) {
obj = l.get(i);
}
*/
for(iterator it = l.iterator();it.hasnext();) {
obj = it.next();
}
long et = system.currenttimemillis();
system.out.println("walklist start time:" + st);
system.out.println("walklist end time:" + et);
system.out.println("walklist use time:" + (et - st));
}
}

3.随机查找。如果map知道了key,list知道了index,其性能在一百万条数据中无多大差别。其实例代码如下:

import java.util.*;
/**
* @author whxu
* @version 1.0.0 2003-4-22 am
*/
public class testmap
{
public static void main(string[] args)
{
system.out.println("begin>>>>>>>>>>>>>>");
long sm = runtime.getruntime().totalmemory();
system.out.println("begin memory :" + sm);
map m = new hashtable();
linkedlist tmplist = new linkedlist();
for (int i=0;i<1000000;i++) {
//m.put(""+i,"i=" + i);
tmplist.add("i=" + i);
}
long em = runtime.getruntime().totalmemory();
system.out.println("end memory :" + em);
system.out.println("end-start memory :" + (em - sm));
//walklist(tmplist);
system.out.println("<<<<<<<<<<<<<<<<end");
//find(m,"985757");
find(tmplist,1000000-1);
//walkmap(m);
//list tmplist = new linkedlist();
//tmplist.addall(m.values());
}
public static void find(map m,string key) {
long st = system.currenttimemillis();
object obj = m.get(key);
system.out.println("find map object:" + obj);
long et = system.currenttimemillis();
system.out.println("find map start time:" + st);
system.out.println("find map end time:" + et);
system.out.println("find map use time:" + (et - st));
}
public static void find(list l,int index) {
long st = system.currenttimemillis();
object obj = l.get(index);
system.out.println("find list object:" + obj);
long et = system.currenttimemillis();
system.out.println("find list start time:" + st);
system.out.println("find list end time:" + et);
system.out.println("find list use time:" + (et - st));
}
public static void walkmap(map m) {
long st = system.currenttimemillis();
for(iterator it = m.values().iterator();it.hasnext();) {
object obj = it.next();
}
long et = system.currenttimemillis();
system.out.println("walkmap start time:" + st);
system.out.println("walkmap end time:" + et);
system.out.println("walkmap use time:" + (et - st));
}
public static void walklist(linkedlist l) {
long st = system.currenttimemillis();
object obj = null;
//system.out.println(l.get(3434));
/*for(int i=0;i<l.size();i++) {
obj = l.get(i);
}
*/
for(iterator it = l.iterator();it.hasnext();) {
obj = it.next();
}
long et = system.currenttimemillis();
system.out.println("walklist start time:" + st);
system.out.println("walklist end time:" + et);
system.out.println("walklist use time:" + (et - st));
}
}

扫描关注微信公众号