zoukankan      html  css  js  c++  java
  • 2017年软件工程第三次作业-2效能分析

    要求0 以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数

          首先,我下载ptime.exe,不知道什么原因我下载下来以后运行老出现闪退现象。一直没法使用。我就接下来开始下载visual studio 2015,但是下载了一下午就是下不下来,我也很苦恼啊,电脑还是变成了巨难用,我下载的时候大概是缺少很多插件,我也不懂了。然后通过请教学长和同学,我使用了Very Sleepy CS软件来对功能进行效能分析。

         由于我上次作业功能四没有实现,我没办法完成以战争与和平作为输入文件,重读向由文件系统读入进行效能分析,这部分功能我现在一直在研究学习,通过看C教程和视频学习字符串、排序和文件部分,单个部分会了,但是这三部分连起来写代码这三个功能我还是实现不了。

    要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化 (或考虑到优化,因此更差的代码没有写出)

         根据代码猜测瓶颈应该在排序算法上,用的快速排序,时间复杂度为O(nlogn),如果文件大的话,把单词进行排序取前十个工作量是很大的。也是影响程序运行效率的重要部分。

    void quick(struct f_word *f, int i, int j)
    {
        int m, n,temp,k;                             
        char b[18];
        m = i;
        n = j;
        k = f[(i + j) / 2].num;                            
        do
        {
            while (f[m].num>k&&m<j) m++;           
            while (f[n].num<k&&n>i) n--;            
            if (m <= n)
            {                                       
                temp = f[m].num;
                strcpy(b, f[m].a);
                f[m].num = f[n].num;
                strcpy(f[m].a, f[n].a);
                f[n].num = temp;
                strcpy(f[n].a, b);
                m++;
                n--;
            }
        } while (m <= n);
        if (m<j) quick(f, m, j);                      
        if (n>i) quick(f, i, n);
    }

    要求2 通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图

    如下图所示:

    要求3 根据瓶颈,"尽力而为"地优化程序性能。

       现在是对排序算法进行优化,在对文件进行排序时,需要排序的数量小于一个数值的时候使用直接插入排序,大于的时候使用快速排序。涉及到swapf(),med3(),vecswap()三个函数,如下代码所示:

    void swapf(struct f_word *f, int a, int b)
    {
        int temp;
        char x[word_size];
        temp = f[b].num;
        strcpy(x, f[b].wd);
        f[b].num = f[a].num;
        strcpy(f[b].wd, f[a].wd);
        f[a].num = temp;
        strcpy(f[a].wd, x);
    }
    
    void vecswap(f_word *f, int a, int b, int n)
    {
        for (int i = 0; i < n; i++, a++, b++)
            swapf(f, a, b);
    }
    
    
    int med3(struct f_word *f, int a, int b, int c)
    {
        return f[a].num< f[b].num ? (f[b].num < f[c].num ? b : f[a].num < f[c].num ? c : a) : f[b].num > f[c].num ? b : f[a].num > f[c].num ? c : a;
    }
    
    void quick(struct f_word *f, int g, int h)
    {
        int m, n, temp, k;
        char b[word_size];
        m = g;
        n = h;
        k = f[g].num; 
        if (g >= h)
            return;
        do
        {
            while (f[m].num>k&&m<h) m++;             
            while (f[n].num<k&&n>g) n--;            
            if (m <= n)
            {                                       
                temp = f[m].num;
                strcpy(b, f[m].wd);
                f[m].num = f[n].num;
                strcpy(f[m].wd, f[n].wd);
                f[n].num = temp;
                strcpy(f[n].wd, b);
                m++;
                n--;
            }
        } while (m <= n);
        quick(f, m, h);                     
        quick(f, g, n);
    }
    
    void qsort7(struct f_word *f, int p, int r)
    {
    
        char x[word_size];
        int len = r - p + 1;
        if (p >= r)
            return;
    
        if (len< 7)
        {
            for (int i = p; i <= r; i++)
            {
                for (int j = i; j > p && f[j - 1].num > f[j].num; j--)
                {
                    swapf(f, j, j - 1);
                }
            }
            return;
        }
    
        int m = p + (len >> 1);
        if (len > 7)
        {
            int l = p;
            int n = r;
            if (len > 40)
            {
                int s = len / 8;
                int s2 = 2 * s;
                l = med3(f, l, l + s, l + s2);
                m = med3(f, m - s, m, m + s);
                n = med3(f, n - s2, n - s, n);
            }
            m = med3(f, l, m, n);
        }
    
        int v = f[m].num;
        strcpy(x, f[m].wd);
    
        int a = p, b = a, c = p + len - 1, d = c;
        while (true)
        {
            while (b <= c && f[b].num <= v)
            {
                if (f[b].num == v)
                    swapf(f, a++, b);
                b++;
            }
            while (c >= b && f[c].num >= v)
            {
                if (f[c].num == v)
                    swapf(f, c, d--);
                c--;
            }
            if (b > c)
                break;
            swapf(f, b++, c--);
        }
        int s, n = p + len;
        s = (a - p)>(b - a) ? (b - a) : (a - p);
        vecswap(f, p, b - s, s);
        s = (d - c)>(n - d - 1) ? (n - d - 1) : (d - c);
        vecswap(f, b, n - s, s);
        if ((s = b - a) > 1)
            qsort7(f, p, s + p - 1);
        if ((s = d - c) > 1)
            qsort7(f, n - s, n - 1);
    
    }

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

    改进前

    改进后

         经过两次效能分析一对比,发现优化前和优化后并没有太大提高,或许是我猜测错误,与排序算法并没有很大的关系。因为算法执行时间并没有太大的改变。可能影响性能的是整个程序并不能特定的说是排序算法。上次作业我就是调试的学长的代码,这次对学长代码进行性能分析,收获还是很大的。处理了原本程序里存在的bug,对程序进行了优化,再接再厉。

    git地址:https://coding.net/u/MingZi-/p/cipingtongji/git

  • 相关阅读:
    HDU
    HDU
    HDU
    【JZOJ4231】寻找神格【分块】
    【JZOJ4231】寻找神格【分块】
    【JZOJ4230】淬炼神体【数论,数学】【二分】
    【JZOJ4230】淬炼神体【数论,数学】【二分】
    【JZOJ4229】学习神技【数论,数学】
    【JZOJ4229】学习神技【数论,数学】
    【JZOJ3771】【NOI2015模拟8.15】小 Z 的烦恼【高精度】【数论】
  • 原文地址:https://www.cnblogs.com/Mingezi/p/7595740.html
Copyright © 2011-2022 走看看