20180925-3 效能分析

作业要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2145]

一、得出程序运行时间

运行截图如下:

第一次运行时间为 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%的。

六、总结

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

posted @ 2018-10-03 16:32  孙赛佳  阅读(198)  评论(0编辑  收藏  举报