1. 程式人生 > >2017年軟件工程第三次作業-2效能分析

2017年軟件工程第三次作業-2效能分析

大於 閃退 font rcp 工作 接下來 原因 char 效果

要求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

2017年軟件工程第三次作業-2效能分析