软件工程 week 03
一、效能分析
1、作业地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2139
2、git地址:https://git.coding.net/kefei101/wfAnalysis.git
3、对wf小程序的功能三进行效能分析,以war_and_peace.txt作为测试文件,使用效能分析工具ptime.exe,连续运行三次,给出每次消耗时间。
说明:下载后,将自己的wf.exe放到word_count_demo文件夹,打开cmd命令行,首先输入ptime wf,再写自己的小程序命令。
三次运行结果如下图所示:
次数 | 时间 |
1 | 3.950s |
2 | 2.851s |
3 | 2.157s |
平均 | 2.984s |
二、猜测瓶颈
针对测试文档war_and_peace.txt,所用到的流程是
所用到的方法有Jagger类的JaggerFormat(),ReadTxt类的txtToString()方法,SortMap类的sortMap(Map map,int num)方法。
我认为程序中耗时较多的函数方法/程序段有以下几个:
(1)我的程序是一层一层深入的,从判断,到逐层进入对应方法,从而执行方法,输出结果。那么我想在JaggerFormat()方法中耗时的有:判断输入格式,分隔字符串
当然这里面还有我的附加功能(输入格式第一个单词是wf.exe所处的文件夹名)所用到的获取路径方法,我觉得这所占时间是必须的,这也是我的程序比他人运行时间更长的原因之一。
1 //用 stringTokenizer 方法截取输入格式每个单词,放入list中 2 StringTokenizer stringTokenizer = new StringTokenizer(order, " "); 3 ArrayList<String> list = new ArrayList<String>(); 4 while (stringTokenizer.hasMoreElements()) { 5 list.add(stringTokenizer.nextToken()); 6 } 7 8 //判断第一个单词是否是wf程序所处文件夹名 9 String project = System.getProperty("user.dir"); 10 project = project.substring(project.lastIndexOf('\') + 1, project.length());
(2)最重要的方法,也是我认为最耗时的方法,这里读取txt文档用到的方法是BufferedReader的r.readLine()方法,测试文件内容很多,上万行,由于是一行一行读取的,速度可能受限,且统计词频的时候要一个一个判断是否是单词,猜测所占时间比较多。优化的话,换一种读取txt文档方法?
1 //一行一行读取txt文档 2 while ((string = reader.readLine()) != null) { 3 4 //将非字母非数字的字符转化为空格 5 string = string.replaceAll("[^a-zA-Z0-9]", " "); 6 string = string.toLowerCase(); 7 //以空格为依据截取单词 8 StringTokenizer stringTokenizer = new StringTokenizer(string, " "); 9 10 //Then use the LinkedHashMap to store words and word frequency. 11 while (stringTokenizer.hasMoreTokens()) { 12 13 String word = stringTokenizer.nextToken(); 14 //判断单词首字母是否是数字,若不是则加入单词序列,否则不要 15 String first = word.substring(0, 1); 16 if (!first.matches("[0-9]{1,}")) { 17 //计算词频 18 if (!map.containsKey(word)) { 19 map.put(word, new Integer(1)); 20 } else { 21 int newNum = map.get(word).intValue() + 1; 22 map.put(word, new Integer(newNum)); 23 } 24 } 25 } 26 }