利用visual VM 分析统计单词频率程序

  最近老师布置了一道关于统计单词出现的频率的程序。并利用相关软件分析一下相应程序的效率问题,看看CPU的利用率问题等。首先我们来分析一下单词的统计频率的问题。

 要想统计一篇英文文本文件的高频词汇。面临以下几个问题:1、存储问题,如果文本文件所含信息量比较大的话,利用什么存储结构来存取这些信息。2、统计高频词。这里主要是对相同单词的计数问题。解决这两个问题的方法直接关系到我们程序的效率。因此我采用一种“一边读取一比统计”的方法。这里主要利用java语言编写采用哈希数据结构来存取单词。这种情况下,算法的最坏的复杂度为O(N^2);

 采用java里面的哈希数据结构的主要原因是java里面的哈希是一种“键值对”的结构,并且哈希的存取是按照自动增加长度的方式来扩充,解决了存取中的内存浪费或不足问题。所以这样的数据结构刚好能解决上述的两个问题。现在我们来看看具体的程序和效率。

一、利用hashmap存取并统计信息

public void countWord(String list){

Map<String,Integer> map = new HashMap<String,Integer>();//将文本文件易字符串形式存到MAP中

Matcher m = Pattern.compile("[a-zA-Z]+").matcher(list);

String key;

while ( m.find() ){

key = m.group();

if ( map.containsKey(key) ){

map.put(key, map.get(key) + 1);

}else {

map.put(key,1);

}

}

this.print("count by word:"+list, map);

}

二、利用comparetor对map对象进行排序

private static class comparator implements Comparator<Map.Entry<String,Integer>>{

public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {

return o2.getValue()-o1.getValue();

}}

三、程序代码测试

wKiom1Mm7Y7TQ3TAAACeP8wvEuw244.jpg

四、利用visual VM 分析程序运行时的性能

1、首先看看内存中各个类名所在内存中的比例。

wKiom1MnwAPDzRD9AAFpbL-KNQI199.jpg由图中看到出char[],int [],byte[]所占比列最大,这是由于HashMap<String,Integer>进行存取引起的效果。

2这是CPU使用情况。可以看得出程序运行时CPU增幅不是很大。

wKiom1MnwAPTrNpBAAEHCct1x3U089.jpg

3、内存增量图

wKioL1Mnv93w_x3KAAGCSlINcD0966.jpg

由图可以看得出,内存变化不是很大,所以采用哈希结构可以帮助大大提高内存的使用效率。


初次使用visualVM 分析java程序,有很多不懂得地方,希望各位看官指点。








你可能感兴趣的:(java语言,public,文本文件,英文,Visual)