一篇关于HashMap性能的测试
具体代码如下:
public class MemoryLookupTest { public static void main(String[] args) throws IOException { String filePath = "D:/tmp_data/countData"; LineNumberReader lineReader = new LineNumberReader(new InputStreamReader(new FileInputStream(filePath))); String line = null ; List<Recorder> recordList= new ArrayList<Recorder>(); long start = System.currentTimeMillis() ; while((line = lineReader.readLine())!=null){ String[] splits = line.split(" "); Recorder r =new Recorder(); r.acct_id = Long.parseLong(splits[0]); r.click = Long.parseLong(splits[2]); r.shw = Long.parseLong(splits[3]); recordList.add(r); } System.out.println(recordList.size()+" recorder ,cost is "+(System.currentTimeMillis()-start)+"ms"); lineReader.close(); Random random = new Random(1000); HashMap<Long,Long> map = new HashMap<Long,Long>(); start = System.currentTimeMillis() ; for(Recorder r :recordList){ map.put(r.acct_id, random.nextLong()/1000); } System.out.println(map.size()+" map initialize ,cost is "+(System.currentTimeMillis()-start)+"ms"); HashMap<Long,Result> resultMap = new HashMap<Long,Result>(); start = System.currentTimeMillis() ; for(Recorder r :recordList){ Long manageId = map.get(r.acct_id); Result result = resultMap.get(manageId); if(result==null){ result = new Result(); resultMap.put(manageId, result); } result.click = result.click + r.click ; result.shw = result.shw + r.shw ; } System.out.println(resultMap.size()+" calculate ,cost is "+(System.currentTimeMillis()-start)+"ms"); } } class Recorder{ public long acct_id ; public long click ; public long shw ; } class Result{ public long click =0 ; public long shw = 0; }
运行结果:
579319 recorder ,cost is 2635ms 308455 map initialize ,cost is 162ms 308455 calculate ,cost is 202ms
运行环境就是普通的笔记本,i5的cpu,8G的内存(但是这个程序使用的是默认虚拟机内存,应该是64M)
做的事情:
其实要做的事情,挺简单的,大约60W的一个list(存储的数据就是每个账户的点击展现数据),大约30W的一个hashMap(存储的是账户以及管理他的经理的id,在上面代码中,经理id是个随机构造的1000以下的数字),计算每个经理下的所有业绩,即每个经理管理的账户的总点击展现是多少 。
过程:遍历60W的list去,针对每条记录去hashMap中查找相应的经理id,然后累计相应的点击展现 。
结果:
结果如上面的展示,对于整个hashmap的查找其实还是挺快的,在30W记录的hashMap中查找60W次然后再相加,其耗时在200ms左右,其实还是相当快的 。
其实在单机的数据处理上,还是挺快的,百万的数据处理得当的话,完全可以在秒级别完成的 。