• 20190919-3 效能分析


    作业要求详见:[https://edu.cnblogs.com/campus/nenu/2019fall/homework/7628]

    代码地址:https://e.coding.net/SpringSun/wf.git

    要求0 以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数。 (2分)

    次数 耗时(s)
    1 1.193
    2 1.180
    3 1.168
    平均 1.180

     

     

     

     

     

     

     CPU参数:Intel(R)Core(TM) i5-5200U CPU @2.20 GHz

     要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化 (或考虑到优化,因此更差的代码没有写出) 。 

      从字符输入流中读取文本并缓冲字符,由于文本里有大量单词,还需要过滤掉除字母以外的字符,我认为这个会非常耗时。

    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 从字符输入流中读取文本并缓冲字符
    		List<String> list = new ArrayList<String>(); // 存储过滤后单词的列表
    		String readLine = null;
    		while ((readLine = br.readLine()) != null) {
    			String[] wordsArr = readLine.split("[^a-zA-Z]"); // 过滤掉除字母以外的字符
    			for (String word : wordsArr) {
    				if (word.length() != 0) { // 去除长度为0的行
    					list.add(word);
    				}
    			}
    		}

    要求2 通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图。 (5分)

      对于笨笨的都不知道啥是profile,更不知道怎么对自己的程序profile。先是问了已经发布博客的同学是怎样做的,然后查询了往届学长学姐的实例,然后下载了一个verysleepys,又在网上找了大量相关资料,感觉不错的推荐看:https://www.cnblogs.com/duanxz/p/3492890.html

      本次用的是JDK1.8自带的jvisualvm.exe来进行profile分析,由于程序功能单一,运行比较快,在main函数中加入以下代码,延长程序执行时间,便于及时查看profile分析结果。

    Thread.sleep(10000);  //测试效能分析

    下面分别是main()、TexCount()、WordCount()等函数的CPU、内存占用时间和分布情况。

      

      统过上面两张图即可看出,该功能耗时比较长的是分别是split.()、BufferedReader.readLine()等函数。

    //split.()函数比较耗时
    String[] wordsArr = readLine.split("[^a-zA-Z]"); // 过滤掉除字母以外的字符
    

    要求3  根据瓶颈,"尽力而为"地优化程序性能。

      由于该功能比较单一,所用到的函数不多,不会有太大的性能提升。可做的优化有,去掉没有必要的print,优化了函数调用逻辑,精简了代码量,使得代码可复用等。以下便是优化后的代码片段、耗时表和截图。

    	public static void main(String args[]) throws InterruptedException {
    		Thread.sleep(10000);  //测试效能分析
    		if ("-d".equals(args[0])){//功能1、2实现:
    			String path = "D:/Project/JAVA/text/" + args[1] + ".txt";
    			try {
    				textCount(path);// 单个文件过滤单词
    			} catch (Exception ex) {
    				System.out.println("请输入正确的文件名称,确认文件存在以及文件是否放在D:/Project/JAVA/text/");
    			}
    		}else if ("-f".equals(args[0])){
    			//功能3实现:
    			String path1 = args[1];
    			File file = new File(path1);
    			if (file.isDirectory()) {
    				File[] filelist = file.listFiles();
    				for (File filePath : filelist) {
    					try {
    						String s = filePath.getPath();// 获取完整路径
    						System.out.println(filePath.getName());//输出文件名
    						textCount(s);
    					} catch (Exception ex) {
    						System.out.println("请输入正确的路径,格式:D:/Project/JAVA/text/");
    					}
    				}
    			}
    		}else if("-s".equals(args[0])){
    			//功能4实现:
    			try {
    					TxtCount();
    				} catch (Exception ex) {
    					System.out
    							.println("请输入正确的命令,eg:java WF.WF < a1.txt,确定后文件存在以及文件是否放在*.java文件目录");
    				}
    		}
    	
    	}
    

      

    次数 耗时(s)
    1 1.134
    2 1.126
    3 1.131
    平均 1.130

     

     

     

     

     

     

     

    要求4  再次Profile

      经过精细化调优代码后,从下面的Profile可以看出CPU和内存耗时有明显的缩短。

     要求5 程序运行时间。

      期待老师的检验和指导。

  • 相关阅读:
    SQL 基础题。
    C# 多维数组.
    C# 泛型相关.
    C# 委托数组.
    ActiveX的数字签名
    Asp.Net Html标记替换.感谢个热心人。弄了好久.
    关于TableLayoutPanel里放入控件无法将Dock设为Fill的解决办法
    服务器×××上的MSDTC不可用解决办法
    vista home下运行asp.net2.0 程序环境配置
    麦克风的调节
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/11568101.html
Copyright © 2020-2023  润新知