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 1022 Train Problem I
    HDU 1702 ACboy needs your help again!
    HDU 1294 Rooted Trees Problem
    HDU 1027 Ignatius and the Princess II
    HDU 3398 String
    HDU 1709 The Balance
    HDU 2152 Fruit
    HDU 1398 Square Coins
    HDU 3571 N-dimensional Sphere
    HDU 2451 Simple Addition Expression
  • 原文地址:https://www.cnblogs.com/Mingezi/p/7595740.html
Copyright © 2011-2022 走看看