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

时间: 2024-08-10 05:40:48

2017年软件工程第三次作业-2效能分析的相关文章

2017秋-软件工程第三次作业(1)-第三周例行总结

第三周例行报告   1本周PSP   2字数统计   博文字数统计不包含本作业中的文字,因为本作业是在截图后写了一些想法之后才得到的. 3代码行数   本周代码工作几乎是把上周的所有代码重写一遍,并进行了大量的尝试工作.有这样的疑问:注释掉的.删除掉的.尝试后废弃不用的代码算不算最后的代码行数呢? 4博文字数   5饼状图 时间统计和上周的饼状图非常相似,为了证明不是从上周的粘贴而来,特意将数值给出 总结: 1本周学习过程中,大部分的工作依旧集中在提交作业前2天. 2感谢老师将提交作业时间设置为

2017年软件工程第三次作业-3功能测试

one 准备工作: 用git bash pull同学的代码,如下截图: two 找其他同学的bug: 一.被检测的同学:贾雅杰同学 1.(1)标题:按回车系统报错 (2)内容:测试环境:win8  VC++ 6.0 重现步骤:打开cmd控制台,输入.exe文件的路径,打开程序代码. 输入1时: 预期结果: 实际结果:会出现错误. 差异:程序运行出现错误. 2.(1).标题:控制台输入非1 2 3 4时,就会进入4.输入文字并统计项. (2).内容:测试环境:win8 codeblocks 预期结

软件工程——第三次作业(二)

对上周作业中的功能4 (仅由文件重定向读入,不由控制台读入) 做效能分析. 功能4:(还没改出来,出错,待续.) git:

第五次作业——python效能分析与几个问题(个人作业)

第五次作业--效能分析与几个问题(个人作业) 前言 阅读了大家对于本课程的目标和规划之后,想必很多同学都跃跃欲试,迫不及待想要提高自身实践能力,那么就从第一个个人项目开始吧,题目要求见下. 阅读 阅读<构建之法>第一章至第三章的内容,并在下方作业里体现出阅读后的成果.特别是第2章中的效能分析及个人软件开发流程(PSP). 参考文章: <构建之法>教学笔记--Python中的效能分析与几个问题 四则运算器效能分析 软工第2次作业-四则运算器 题目描述 可以选择以下题目(或者自主选择题

软件工程第三次作业

本周的作业请参照此文:http://www.ruanyifeng.com/blog/2015/12/git-workflow.html 制定本组项目的GitHub版本更新流程. 制定本组的代码规范.GitHub提交源码的标准. 组长组织每周例会(可以使用群微信群试验一下每天沟通项目开发进度的方法)需要有证据能够在博客上公布 根据邹欣老师的教材相关内容,确定小组成员的角色,细化项目需求.时间计划.列出产品积压工作项和预计开发时间 第一题:制定本组项目的GitHub版本更新流程 通过学习链接中的内容

软件工程第三周作业:微软必应词典案例分析

0x01 :微软必应词典案例分析 0x0104 :微软必应词典功能性BUG说明       0x010404 : BUG – 1 – 模块功能未实现 运行环境或平台 iOS 9.0.1 必应词典软件版本 版本3.5,版权所有@2014 Microsoft 软件测试BUG特征 [优先级1]应用程序模块功能未实现,包含整个模块不能正常运行 重现步骤 1. 打开必应词典软件进入设置中,选择跨软件查词设置,设置为打开和一直运行 2. 按照使用说明所说随意打开某一App(这里选择提醒事项) 3. 按使用说

软件工程第三次作业(微软小娜案例分析)

第一部分 调研, 评测 1.上手体验  我使用的是win10系统,所以自带Cortana,之后又在手机上下载了安卓版本.第一感受不管是在电脑上还是在手机上都比较流畅,优化的比较好.电脑上使用也比较方便,在桌面上就能直接打开,安卓手机则需要下载.使用上,语音识别还算准确,而且搜索到的信息也比较有用. 2.bug测试 (1)语音输入后莫名弹出必应. (2)语音识别不太准确 3. 用专业的语言描述 (每个bug 不少于 40字),如有必要, 可以配图. 当语音输入有标点时,Cortana有几率打开ed

软件工程第三次作业 - 每周例行汇报

本周PSP, 类型.任务.开始时间.结束时间.中断时间,delta时间.要求开始和结束时间包括日期.从作业要求公布之时起,至截止时刻,其间的工作有效,也本周四晚和周五全天.包含本周六.本周日. 本周进度条: 代码行,博文字数,用到的知识点 累积进度图: 到本周为止的代码累积折线图,到本周为止的博文字数累积折线图 本周PSP饼状图,按任务类别分类,给出时间所占比例 本周PSP 类型 任务 开始时间 结束时间 耽误时间(分钟) 耽误时间说明 △(分钟) 学习 学习英语 2017.9.21  18:0

2017年软件工程第十一次作业-每周例行报告

1.PSP表格 C(类别) C(内容) ST(开始时间) ET(结束时间) INT(间隔时间) Δ(净时间) 事后诸葛亮会议 对β发布进行总结 2017.11.29 18:30 2017.11.29 19:25 0 55 β发布用户试用报告 找用户试用产品 2017.11.23 19:34 2017.11.23 20:28 0 54 2017.11.24 12:12 2017.11.24 12:50 0 38 接受用户反馈意见 2017.11.24  9:22 2017.11.24 10:05