作业地址: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分)

针对单词的查找进行优化,但是运行结果都不对。暂时放弃了。

要求4 再次 profile,给出在 要求1 中的最花费时间的3个函数此时的花费。要求包括截图。(2分)

02-10 00:47