1. 預計時間
● 對問題總體的理解、規劃:10 min
● 設計編寫程式:5 h
● 除錯: 分模組-40 min; 總體-40min
● 測試(效能分析)、改進:1 h
2. 實際用時
● 對問題總體的理解、規劃:10 min
總的理解了一下題意,打算用C#寫。程式資料結構不復雜,沒有打算用OOP。
● 設計編寫程式:
i) 模式判斷:讀引數,確定是哪種模式(普通、e2、e3)。
這部分比較簡單。10min左右完成。
ii) 讀出所有子檔案:採用遞迴的方法。
這部分查了一下C#檔案方面的類和介面的用法。40min左右完成。
iii) 分詞:把檔案的單詞劃分出來。
這部分比較坎坷。在做simple mode的時候,學習了一下正規表示式的書寫,完成大約用了1h 10min。先做了Simple mode的統計詞頻,然後再做extend mode的時候,原本是以為只需要選擇不同的正規表示式即可,然而C#的正則的Matches方法是非重疊匹配,在做2詞、3詞連續時匹配就不適用了。後來重寫了2詞、3詞連續時分詞的方法,但是邏輯有點繁瑣複雜,限於時間湊合用了。算上查正則的時間,可能用了2.5h吧。
ix) 詞頻統計:統計某個詞(片語)出現的頻率。
這部分用的方法也有點蠢,因為在統計時不敏感大小寫,但是輸出時要考慮原有的ACII值排序,所以比較麻煩,用的方式是先對分詞的結果(一個ArrayList)進行自帶的Sort排序。這樣得到的結果是字典序,大寫在後。然後再遍歷ArrayList,記錄前一個單詞,對比當前的單詞。因為相同的單詞都是相鄰的,所以可以進行比較、處理。最後得到一個Dictionary記錄單詞與出現頻率。
x) 排序輸出:(統計出現頻率最高的片語)按ASCII值排序並輸出到檔案。
這部分也是意想不到的挑戰。之前以為按值排序應該蠻簡單的,但是加上ASCII值的要求又麻煩了一些。還去學寫了IComparer,不過後來發現用StringComparer.Ordinal就可以了。雖然花了意外的時間,但是也有很大的收穫。
● 除錯:
我的習慣是寫完一個模組就會做一些基本的測試。所以除錯的時間比較零碎了。估計總計在2h左右。
● 測試(效能分析)、改進:
這裡最大的坑是我的效能分析工具。因為電腦上空間不太足,又已經有安裝VS2010,去查了一下2010也有效能分析的功能,就打算就用2010了。誰知最後一天做分析時,自己的2010不知道為何一分析就崩潰。下載2013後結果空間不足不能安裝,又用分割槽工具搗鼓了下。但是安裝時間太長,眼看著就要到deadline……於是接了同學的電腦,他的VS2010能用分析,讓我妥妥地淚奔了。但是時間實在太短,沒來及做很多改進了,主要是分析。這個裝工具的時間就不知道該怎麼算了……工作了估計不到2h。
3. 效能分析
這是我作死的大坑……
來看“大資料”的處理吧:包含2.27G的資料夾,主要是找的一些程式安裝的資料夾什麼的。
CPU的使用率不理想啊……然後匯出到excel函式獨佔率:
看來WordFren,也就是詞頻統計佔了大頭,ReadWord,也就是分詞也不少。後面分析兩詞、三詞的結果也是類似,就先不放上來了。
不過呢我也沒想到優化這裡的比較好的方面(主要沒時間了)。
後面有機會再補充吧。
4. 測試用例
1)空資料夾
輸出為空,沒問題。
2)巢狀資料夾
這也是最基本的了,沒問題。
3)【單】詞模式
測試了輸出格式,“3個英文字元打頭”等要求,出現頻率,及按ASCII排序輸出。
4)【雙】詞模式
類似,並測試了“僅一個空格間隔”的要求。
5)【三】詞模式
類似。
6) 迷惑的單詞模式
輸入含File、file的檔案,測試輸出時能夠按ASCII值選擇名字。
7) 迷惑的雙詞、三詞模式
輸入類似file File File file FILE的文字,測試是否正確統計重複輸出。
8) 豐富的字尾
測試了除txt外的格式檔案。
9) 壓力測試-1
測試了大約1M的檔案。
10)壓力測試-2
測試了大約2.27G的檔案。(效能分析中的分析組)
5. 感想
現在也在忐忑,到底程式還有沒有bug。0 point 還是有點嚇人的。一個很大的教訓是過於放心自己,開始的太晚了。以致最後工具出現問題,導致對效能的改進沒有時間了。
從這個專案也收穫了很多,一是更熟悉了C#,二是學習了正規表示式,三是學到了效能分析這個功能。
當然!最後的程式自己還是很不滿意的,因為不算漂亮,這也是限於時間的原因,查C#類和介面的資料也佔了很多時間。
總之,希望下一次自己能做得更好。