第三次作业2
要求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