作业地址:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7628
要求0:以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数。 (2分)
测试代码地址:https://e.coding.net/gitli/ceshikangzhedaima.git
CPU:Inter(R) Core(TM) i5-4210U CPU @ 1.70GHz 2.40 GHz
耗费时间:6.295s,6.266s,6.283s
要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化 (或考虑到优化,因此更差的代码没有写出) 。
在单词读取中,会遇到空格,标点符号,在遍历单词的过程中应该会耗费较多的时间。
if(isalpha(ch)||(isdigit(ch))) { flag = 1; tmp[i++]=ch; } else { if(flag) { if((ch=='-')||(ch=='\'')) { tmp[i++]=ch; flag = 1; } else { flag=0; tmp[i]='\0'; i=0; for(j=0;j<num;j++) { if(strcmp((words+j)->w,tmp)==0) { (words+j)->fre++; break; } } if(j==num) { (words+num)->fre=1; strcpy((words+num)->w,tmp); num++; } if(num==500*p) { p++; words=(wordnode*)realloc(words,500*p*sizeof(wordnode)); for(k=num;k<500*p;k++) { (words+k)->fre=0; } } } } } ch = tolower(fgetc(fp));
要求2 通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图。 (5分)
程序最耗费时间的三个函数:strcmp(),fun1(),getc()
while(ch!=EOF) { if(isalpha(ch)||(isdigit(ch))) { flag = 1; tmp[i++]=ch; } else { if(flag) { if((ch=='-')||(ch=='\'')) { tmp[i++]=ch; flag = 1; } else { flag=0; tmp[i]='\0'; i=0; for(j=0;j<num;j++) { if(strcmp((words+j)->w,tmp)==0) { (words+j)->fre++; break; } } if(j==num) { (words+num)->fre=1; strcpy((words+num)->w,tmp); num++; } if(num==500*p) { p++; words=(wordnode*)realloc(words,500*p*sizeof(wordnode)); for(k=num;k<500*p;k++) { (words+k)->fre=0; } } } } }
要求3 根据瓶颈,"尽力而为"地优化程序性能。 (5分)
针对单词的查找进行优化,但是运行结果都不对。暂时放弃了。