软件工程第三次作业 - 效能分析
要求0:以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数。
第一次运行结果:
本次程序运行所消耗的时间为1.2秒。
第二次运行结果:
本次程序运行所消耗的时间为936毫秒。
第三次运行结果:
本次程序运行所消耗的时间为975毫秒。
要求1:给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化 (或考虑到优化,因此更差的代码没有写出) 。
上周的代码我使用的是结构体数组来对分割好的单词进行存储并采用冒泡排序,效果非常不理想,统计完war_and_peace.txt这个文件需要7秒左右。
struct words { int num; char word[20]; };
while (feof(fp) == 0) { fscanf(fp, "%s", temp); //输入文件名 //字符串过滤 dispose(temp); if (temp != NULL) { int i = 0; //标记返回值 //判断是否有重复 if ((i = issame(str, temp, n)) != 0) { //有重复 str[i].num += 1; } else { //没有重复 sprintf(str[n].word, temp); str[n].num += 1; n++; } } }
这周代码存储单词采用了哈希表存储并采用快速排序,效果有了显著的提升,统计war_and_peace.txt这个文件仅需要900毫秒左右。
Hashtable strTab = new Hashtable(); for (int i = 0; i < strArr.Length; i++) { if (strArr[i] != "") { if (strTab.Contains(strArr[i])) { //已有 strTab[strArr[i]] = (int)strTab[strArr[i]] + 1; } else { //没有 strTab.Add(strArr[i], 1); } } }
因为哈希表有查找效率高的优点,所以改用了哈希表之后运行速度有了明显的提升。
要求2:通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图。
本程序中,以上三个函数最花费时间。
上面三个函数中最花费时间的是Statistics函数,因为函数中有对字符串进行分割的操作:
string[] strArr = str.Split(ch);
上面代码通过Split()函数对字符串进行分割,导致花费的时间非常多。
要求3:根据瓶颈,"尽力而为"地优化程序性能。
本人尝试过一个字符一个字符的读取,当读取到自定义的分隔符后,将读取出来的字符串存入到哈希表中,但是这个方法更慢,所以目前最优的方案是就是用Split()函数来对字符串进行分割。
要求4:再次 profile,给出在 要求1 中的最花费时间的3个函数此时的花费。要求包括截图。
由于本人无力对程序进行优化,所以此时最花费时间的三个函数没有变。
我是Vector,谢谢关注。