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


 

 

 




posted @ 2017-09-26 21:59  Lym7645  阅读(157)  评论(2编辑  收藏  举报