1. 程式人生 > >第三次作業2

第三次作業2

blob 其中 mas 速度 說明 文件 end temp 特殊符號

要求0

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

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

技術分享

技術分享

技術分享

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

要求 給出代碼片斷,並說明為什麽你會認為此處是瓶頸,預計優化會有達到多好的效果。

讀取輸入並將其拼接成字符串的操作
1             while (getline(cin, temp))
2 { 3 if (!temp.empty()) 4 { 5 6 fInputs += temp; 7 fInputs += ; 8 } 9 }

需要getline讀入,並且需要對字符串進行拼接,循環的詞數多,同時使用+=進行字符串拼接效率比較低(聽同學說的)

要求2 通過 profile 找出程序的瓶頸。給出程序運行中最花費時間的3個函數(或代碼片斷)。要求包括截圖。 (5分)

要求 分析為什麽此處是瓶頸。

最初使用cpu采樣,得到的結果是這樣的

技術分享

然後進行了“檢測”

技術分享

得到了耗時最長的三個函數

然後發現程序的耗時瓶頸主要在兩個部分

其中第一個_memmove發現自己並沒有寫這個函數,點進去後發現是MSVCR110.dll中的函數

技術分享

其中調用這個函數最多的是erase函數,我使用這個函數來刪除字符串中的各種字符與標點

這個字符串操作會不斷改變字符串的長度

後面兩個都是getline函數的問題

技術分享

其中主要就是字符串拼接效率比較低

要求3 根據瓶頸,"盡力而為"地優化程序性能。 (5分)

要求 給出如何改進瓶頸,改進後與改進前程序原理上 (而不是效果上的) 的差異。

針對於字符串拼接,換了不同的方式,例如使用append()代替+=

技術分享

然後發現並沒有什麽用。從原理上講好像也沒什麽區別

然後對於第一個問題,原本的思路是將標點與特殊符號刪除,這是整個程序最耗時的一部分,將其改成將其替換成空格,這樣減少了字符串操作的詞數,速度大幅度提高

技術分享

git地址
https://git.coding.net/Hitagi123/word-count.git


 




第三次作業2