第三周作业之效能分析
git地址:https://git.coding.net/wangwd/SecondAssignment.git
要求0
测试一
消耗时间:2.978 S
CPU参数:占用小于10%
测试二
消耗时间:5.273 S
CPU参数:占用小于10%
测试三
消耗时间:2.378 S
CPU参数:占用小于10%
要求1
猜测代码瓶颈
1 String line = " ";
String不能动态分配内存,可能会使程序内存占用过多,以致拖慢整个程序的运行速度。
要求2
profile未优化的程序
最花费时间的三个代码片段
代码片段一(控制台读入)
1 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 2 //bw = new BufferedWriter(new FileWriter("test.txt",true)); //true表示是否追加 3 String str = br.readLine(); //接收用户输入 4 while(!str.equals("exit")){//如果用户输入exit则退出循环 5 line = line + " "+str; 6 //继续接收输入 7 str = br.readLine(); 8 9 }
代码片段二(存词)
1 for(String s: str1){ 2 //判断s是否是字母开头 3 if(s.matches(mt)){ 4 if(!map.containsKey(s)){ 5 //如果集合中不存在该单词,则将该单词加入该集合中并且计数设为1。 6 map.put(s,1); 7 //每当有新单词加入,计数加1。 8 count++; 9 }else{ 10 //如果集合中存在该单词,则将该单词加入该集合中并且计数加1。 11 map.put(s,map.get(s)+1); 12 } 13 } 14 }
代码片段三(排序)
1 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 2 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 3 //降序排序 4 @Override 5 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 6 //return o1.getValue().compareTo(o2.getValue()); 7 return o2.getValue().compareTo(o1.getValue()); 8 } 9 });
要求3
改进代码瓶颈
改进一
改进前
1 String line = " ";
改进后
1 StringBuilder line = new StringBuilder(" ");
改进二
改进前
1 //将大写字符转换成小写字符(方便统计) 2 line.toLowerCase();
改进后
1 //将大写字符转换成小写字符(方便统计) 2 //字符串拼接 3 String line1 = line.toString(); 4 line1 = line1.toLowerCase();
要求4
profile优化的程序
虽然对程序改进了,但是好使的代码片段并没有改变。
最花费时间的三个代码片段
代码片段一(控制台读入)
1 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
2 //bw = new BufferedWriter(new FileWriter("test.txt",true)); //true表示是否追加
3 String str = br.readLine(); //接收用户输入
4 while(!str.equals("exit")){//如果用户输入exit则退出循环
5 line = line + " "+str;
6 //继续接收输入
7 str = br.readLine();
8
9 }
代码片段二(存词)
1 for(String s: str1){
2 //判断s是否是字母开头
3 if(s.matches(mt)){
4 if(!map.containsKey(s)){
5 //如果集合中不存在该单词,则将该单词加入该集合中并且计数设为1。
6 map.put(s,1);
7 //每当有新单词加入,计数加1。
8 count++;
9 }else{
10 //如果集合中存在该单词,则将该单词加入该集合中并且计数加1。
11 map.put(s,map.get(s)+1);
12 }
13 }
14 }
代码片段三(排序)
1 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
2 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
3 //降序排序
4 @Override
5 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
6 //return o1.getValue().compareTo(o2.getValue());
7 return o2.getValue().compareTo(o1.getValue());
8 }
9 });