20180925-3 效能分析

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

对上周作业中的功能4 (仅由文件重定向读入,不由控制台读入) 做效能分析,以[https://coding.net/u/younggift/p/word_count_demo/git/blob/master/war_and_peace.txt]为输入数据。

git地址:https://coding.net/u/Ruidxr/p/Word_Frequency_Count/git

1. 以 战争与和平 作为输入文件,重读向由文件系统读入。

由于在vs中使用profile测试功能4会出现如下错误:

多次安装vs2015也并没能完成测试,最后CPU参数的测定以及后续的测试使用了very-sleepy。

第一次:

第二次:

第三次:

2. 给出你猜测程序的瓶颈。

测试前我猜测的程序的瓶颈是单词识别部分的代码,因为我是一个字符一个字符进行判断的,觉得很耗时。代码如下:

while(!feof(fp))
    {
        c=fgetc(fp);
        
        if((c>=97 && c<=122) || (c>=65 && c<=90) || c==95 || c==45 || c==39)
        {
            if(c>=65 && c<=90)
                str[i]=c+32;
            else
                str[i]=c;
                                                //word中用"_"或'-'或'\''连接的算一个单词
            str[++i]='\0';
            flag=0;
        }
        else
        {
            if(flag==0)                    //如果是紧跟(考虑到有连续出现2个及以上标点的情况)在一个字母后的标点,
                                        //则前面读取到了一个单词,存入链表
            {
                Save_word(str,head);
                flag=1;
                i=0;
            }
        }
    }
View Code

3. 通过very-sleepy找程序的瓶颈。

根据截图可以看出排序和存储单词这两个函数十分耗时,由于功能4的单词的判定写在了主函数里,也比较耗时。

4. 根据瓶颈,"尽力而为"地优化程序性能。

将排序算法由选择排序改为快速排序;

void QuickSortstruct word* array,struct word* left,struct word* right)
{
    assert(array);
    if(left.num >= right.num)
    {
        return;
    }
    QuickSort(array,left,index->next);
    QuickSort(array,index->next,right);
}
View Code

由于程序使用了链表,在存储单词的过程中十分耗时,应该改用数组会更有效率,但是由于所需改动太大,没能实现。

通过这次效能测试,深刻的体会到了链表有多费时。

5. 再次使用very-sleepy,给出此时的花费。

 

posted @ 2018-10-07 15:13  段晓睿  阅读(136)  评论(0编辑  收藏  举报