第三次作業2
阿新 • • 發佈:2017-09-27
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