zoukankan      html  css  js  c++  java
  • 第三次作业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


     



  • 相关阅读:
    职责链模式——行为型模式(1)
    创建型模式总结
    命令模式——行为型模式(2)
    桥接模式——结构型模式(2)
    享元模式——结构型模式(6)
    外观模式——结构型模式(5)
    适配器模式——结构型模式(1)
    组合模式——结构型模式(3)
    oencv学习(10)opencv mul()每个元素相乘
    oencv学习(8)背景消除
  • 原文地址:https://www.cnblogs.com/linym762/p/7598761.html
Copyright © 2011-2022 走看看