第三周作业之效能分析

时间:2021-05-04 22:11:12

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 });