1. 程式人生 > >第三周作業2——效能測試

第三周作業2——效能測試

功能 診斷 images pan exe 今天 n) ade 是不是

作業要求來自:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/956

(此處想加一個目錄)

要求0 (舊)

以 戰爭與和平 作為輸入文件,重讀向由文件系統讀入。連續三次運行,給出每次消耗時間、CPU參數。 (2分)

Windows系統推薦使用 ptime.exe。下載在此[https://coding.net/u/younggift/p/word_count_demo/git/blob/master/ptime.exe]。

運行方法 ptime wf -s < war_and_peace.txt

我的功能4測試失敗,因為我的重定向功能是讀取一行字符串,遇到回車之後會停止。運行截圖:

技術分享

所以我先采取功能2的方式吧。盡管如此,還是不符合要求的。

技術分享技術分享

avg = (0.541+0.269+0.266)/3 =0.359(保留3位有效數字)

要求1 給出你猜測程序的瓶頸。你認為優化會有最佳效果,或者在上周在此處做過優化 (或考慮到優化,因此更差的代碼沒有寫出) 。

這是上周就這樣寫的,我不知道還有什麽地方可以優化。

1         string[] s = cnt.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);2         //len是詞的總個數,計算一遍就可以了
3         len = s.Length;
4 for (int i = 0; i < len; i++) 5 { 6 //省略,處理每個詞 7 }

以上是2017年9月24日星期天寫的一部分。在當天的班級微信群中,老師再次建議我重新寫一下。


2017年9月25日今天,我花了大概2h40min時間實現了功能4-1。對於程序中用到的函數更加熟悉了。不過還是不仔細、全面吧。比如

StreamReader streamReader = new StreamReader(Console.OpenStandardInput(),Encoding.Default); 

這裏用到的OpenStandardInput()函數,是我在Ranh學長程序裏學到的。之前我寫的是

string text = Console.ReadLine();

只能讀取一行。

我還沒有學習關於標準輸入輸出函數相關的知識,是不是也要被懟。【捂臉】先完成作業吧:p

所以我想用新寫的程序來作為效能測試的程序。但是還沒有建立git倉庫,明天建立,上傳到coding.net上。


要求0(新)

技術分享

技術分享

技術分享

平均運行時間=0.635s

要求1 我猜測的可優化處:

  • 1
     strlen = str.Length;
     if (strlen > maxlen) maxlen = strlen; 

因為這個功能沒有要求對齊(不知道是否是故意如此設置?)我在字符串拼接的時候刪掉了拼接空格的循環。但是這裏計算每個單詞的長度找最大值這裏沒有註釋。

  • 2
     while((line = streamReader.ReadLine()) != null)

    這裏是不知道有沒有可以優化的,我不知道優化方法。因為這篇效能測試提到http://www.cnblogs.com/WeSure6/p/5275715.html,但是他是直接讀入特定的文件。相似,又不同。我現在還不明白效能測試的樣本是什麽,我一會兒進行效能測試,是要改成直接讀文件嗎?昨天測試的一波都不成功,沒有生成測試報告,有的生成了,但是裏面的函數都不是我程序裏面寫的類方法,和範例中的博客的截圖都不太一樣。然後當時比較煩躁,沒有截圖和記錄。

要求2 通過分析工具找出程序的瓶頸。

技術分享技術分享

技術分享

技術分享

嗯……後來在診斷工具發現了不一樣的展示,然後點擊調試,看診斷工具。

技術分享

技術分享

程序運行中最花費時間的3個函數的代碼片斷:

1      line = line.Replace("‘s", "").Replace("‘m", "").Replace("", "").Replace("", "").Replace("?", "").Replace("!", "").Replace(",", "").Replace(":", "").Replace("\"", "").Replace("", "").Replace("", "").Replace(".", "").Replace(";", "").Replace(")", "").Replace("(", "");
2      line = line.Replace("1", "").Replace("2", "").Replace("3", "").Replace("4", "").Replace("5", "").Replace("6", "").Replace("7", "").Replace("8", "").Replace("9", "").Replace("0", "").Replace("*","");
3 
4      string pat = " ";
5      string[] wordlist = Regex.Split(line, pat);
6 
7      Directory類操作
8      

分析:

1.Replace()的效率問題。bing之後http://www.baiwanzhan.com/site/t122693/這裏提到StringBuilder效率更高。

https://www.52jbj.com/rjbc/498788.html這裏解釋了原理。http://www.cnblogs.com/tonysuen/archive/2010/03/04/1678447.html這裏查到用法。

要求3 修改瓶頸、原理分析

技術分享

技術分享

怎麽時間反而長了?之前的是采樣的?明天繼續搞。【今晚還要復習matlab,明天課堂測試,拖到現在才復習.....】

本來想明天整理好再先發出來,但是因為看到老師在評論,所以想還是早點發出來吧,萬一被評論到,有問題明天還能改~不過這樣是不是對讀者不太負責任呀,請見諒~

第三周作業2——效能測試