作业链接地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2139
一、效能分析
要求0:GIT仓库地址:https://git.coding.net/wudb527/wfAnalysis.git
要求1:第一次分析消耗时间(原来没有使用命令行作参数,此时经过了稍稍修改)
三次消耗时间整理如下:
次数 | 耗时(s/秒) |
第一次 | 70.991 |
第二次 | 70.892 |
第三次 | 70.837 |
平均 | 70.907 |
瓶颈猜测一:在打开文件之后,我是将文件内所有的字符拼接为一个string类型的串(如下):
1 ifstream infile; 2 string file_txt = "", str; 3 infile.open(File_Name.c_str());//打开文件 4 while (getline(infile, str)) 5 { 6 file_txt = file_txt + str + ' '; 7 } 8 infile.close();
而当文本非常大是,所拼接操作的字符串也会非常大,我觉得会造成严重的耗时。
瓶颈猜测二:在将字符串按照空格分割时,我使用的是sstream 里的stringstream,这等于又进行了一次输入,花费了时间
stringstream ss(file_txt);
while (ss >> str) { if (str[0] >= '0' && str[0] <= '9') continue; Max_wordsize = Max(Max_wordsize, str.size());//寻找最长单词的长度 if (Map[str] == 0) Vstr.push_back(str);//把每一个单词不重复的保存起来 Map[str]++; ++sum_word; }
要求2:性能分析
最耗时的三个代码片段
分析:
(1)正如猜测的一样,在代码拼接时消耗了太多时间
(2)用stringstream重定向数据流时间耗费较大
优化:
(1)用C语言打开文件,直接把数据保存在一个字符数组里
(2)顺序遍历整个字符串,然后在拼接为单个string类型,O(n)复杂度
要求3:优化方法:
(1)用C语言打开文件,直接把数据保存在一个字符数组里,在只有只要遍历一次拼装成string串放入map
const int maxn = 10000000+100; char Buffer[maxn];
FILE *fp; fp = fopen(File_Name.c_str(),"rb"); int size_file = fread(Buffer,1,maxn,fp); Buffer[size_file] = '