20180925-3 效能分析

Posted sunsaijia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20180925-3 效能分析相关的知识,希望对你有一定的参考价值。

一、得出程序运行时间

运行截图如下:

技术分享图片

第一次运行时间为 0.942 s

技术分享图片

第二次运行时间为 0.826 s

技术分享图片

第三次运行时间为 0.861 s

平均运行时间为:0.876 s

CPU参数:Intel(R) Core(TM) i5-4200M CPU @ 2.50GHz  2.50GHz

 

二、猜测程序瓶颈

猜测一:每次查询map容器该单词是否出现过比较费时,因为个单词都要去查询一遍,优化过后可能运行快5%。

    if(mp[str]==0){
        s.push_back(str);
        mp[str]++;
        totalword++;
    }else{
        mp[str]++;
    }

猜测二:判断是否是单词组成元素比较费时,因为要去判断每一个字符,优化过后可能运行快10%。

if(isalpha(ch)!=0||(ch==&&len>0)||ch==-||(ch>=0&&ch<=9&&len>0))

三、利用profile找出瓶颈

CPU使用率截图:

 

 

技术分享图片

 函数调用次数及运行时间截图:

技术分享图片

这儿可以看到最耗时的三个函数分别是:map的查找比较函数,string的拼接函数以及判断是否为字母函数。

map查找比较函数和string拼接函数:

 

if (mp[str] == 0) {
    s.push_back(str);
    mp[str]++;
    totalword++;
}
else {
    mp[str]++;
}

 

判断字母函数:

if (isalpha(ch) != 0 || (ch == &&len>0) || ch == - || (ch >= 0&&ch <= 9&&len>0))

 

分析:map和string的两个函数可能需要调用堆栈,消耗时间比较多,而判断字母函数因为执行的次数多,导致最后运行时间就比较多。

四、优化程序

map和string想不出怎么优化,判断函数直接和字母进行比较。相应的函数变化如下:

if (text[i]>=a&&text[i]<=z) {
        ...
}
else if (text[i]>=A&&text[i]<=Z) {
    ...
}
else if ((text[i]== &&len>0)||text[i]==) {
        ...
}

五、再次profile测试

ptime运行时间截图:

技术分享图片

第一次运行时间为 0.826 s

技术分享图片

第二次运行时间为 0.817 s

技术分享图片

第三次运行时间为 0.827 s

平均运行时间为:0.823 s

比未修改时快了0.053s

CPU使用率截图:

技术分享图片

函数调用次数及运行时间截图:

技术分享图片

 可以看到map和string函数运行时间比例基本上没有变化,判断字母函数找不到了,其他运行函数的运行时间百分比都是低于0.1%的。

六、总结

经过修改,程序的运行速度有了一定的提升,有很多地方我还没能力去修改,如果能进一步修改,程序的运行速度会有进一步的提升。在以后的程序中,我们一定要灵活运用各种工具,优化程序,提升程序运行速度。


以上是关于20180925-3 效能分析的主要内容,如果未能解决你的问题,请参考以下文章

效能分析——词频统计器(第二版)

效能分析

效能分析

wf效能分析

词频统计及其效能分析

词频统计及效能分析