經過一天的優化和測試后,我深刻的感覺到需要一篇總結來總結經驗教訓。
今天遇到的最大的問題是內存管理的問題。
在之前的簡單樣例中,這本不是一個問題,但是當我今天換了一個100多MB的文件夾當樣例后,一切都不一樣了。
我的簡簡單單的9KB的程序居然調用了1.2G的內存長達4分鍾,而其他同學的程序大約調用內存100MB以內。

如上圖占用內存1316MB
經過分析我發現我的內存主要是存在於存儲中。
for(...)
{
Word a = new Word(str[i], str[i].ToLower(), 1);
wordlist.Add(a);
}
就是以上的代碼占用了1.2G的內存。
我無條件的存儲了所有的單詞,包括了完全一樣重復的(我想要先全部存儲,再處理,這樣不用檢索時間)。
對於這么大的文件量統計出的所有單詞,每個單詞建立一個對象存儲入List集合中,自然也就會占用大量內存。
而其他的同學會判斷是否存在相同的,如果不同才重新建立對象存入。
那么我又有了一個問題,如果檢索判斷,那么對於每個單詞都在List中需要一個O(n)的檢索歷程。
所以繼而引發的是數據結構的問題了,List中檢索太慢,我就換成了Hashtable,實現O(1)的檢索。
這樣改變后,由於重復對象在存儲前已經合並,占用內存大大降低,時間也節約了不少。
如下圖時間降為77秒:(樣本也降低了不少)
如上圖內存占用降為67MB
所以軟件工程與以前的程序不同,需要考慮大樣本,不僅要考慮到運行時間還要考慮到內存調用。z