第2次作业

 作业链接地址:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2139

一、效能分析

要求0:GIT仓库地址:https://git.coding.net/wudb527/wfAnalysis.git

要求1:第一次分析消耗时间(原来没有使用命令行作参数,此时经过了稍稍修改)

三次消耗时间整理如下:

次数 耗时(s/秒)
第一次 70.991
第二次 70.892
第三次 70.837
平均 70.907

瓶颈猜测一:在打开文件之后,我是将文件内所有的字符拼接为一个string类型的串(如下):

1     ifstream infile;
2     string file_txt = "", str;
3     infile.open(File_Name.c_str());//打开文件
4     while (getline(infile, str))
5     {
6         file_txt = file_txt + str + ' ';
7     }
8     infile.close();

而当文本非常大是,所拼接操作的字符串也会非常大,我觉得会造成严重的耗时。

瓶颈猜测二:在将字符串按照空格分割时,我使用的是sstream 里的stringstream,这等于又进行了一次输入,花费了时间

stringstream ss(file_txt);
    while (ss >> str)
    {
        if (str[0] >= '0' && str[0] <= '9') continue;
        Max_wordsize = Max(Max_wordsize, str.size());//寻找最长单词的长度
        if (Map[str] == 0) Vstr.push_back(str);//把每一个单词不重复的保存起来
        Map[str]++;
        ++sum_word;
    }

 要求2:性能分析

最耗时的三个代码片段

分析:

(1)正如猜测的一样,在代码拼接时消耗了太多时间

(2)用stringstream重定向数据流时间耗费较大

优化:

(1)用C语言打开文件,直接把数据保存在一个字符数组里

(2)顺序遍历整个字符串,然后在拼接为单个string类型,O(n)复杂度

要求3:优化方法:

(1)用C语言打开文件,直接把数据保存在一个字符数组里,在只有只要遍历一次拼装成string串放入map

const int maxn = 10000000+100;
char Buffer[maxn];
    FILE *fp;
    fp = fopen(File_Name.c_str(),"rb");
    int size_file = fread(Buffer,1,maxn,fp);
    Buffer[size_file] = '';
    fclose(fp);

(2)顺序遍历整个字符串,然后在拼接为单个string类型,O(n)复杂度

 1     for(int i = 0 ; i < size_file; ++i)
 2     {
 3         ch = Buffer[i];
 4         if(ch >= 'A' && ch <= 'Z') ch = ch + 32;
 5         if((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <='9'))
 6         {
 7             str += ch;
 8             continue;
 9         }
10         if(!str.empty())
11         {
12             if(str[0] >= 'a' && str[0] <= 'z')
13             {
14                 if(Map.count(str)) ++Map[str];
15                 else
16                 {
17                     Vstr.push_back(str);
18                     ++Map[str];
19                 }
20                 ++sum_word;
21             }
22             str = "";
23         }
24 
25     }

再次profile分析

下面是三个最耗时的代码片段占用百分比

下面是最后三次测试的时间

下面是表格

时间加快了进一百多倍

次数 耗时(s/秒)
第一次 0.432
第二次 0.371
第三次 0.370
平均 0.391

要求4:(助教测试)

二、自我评估

1.首先通过这次作业我认识到了应用合适的数据结构,方法会是速度加快很多。比如这次使用C语言里的文件读取函数会使读取速度大大加快(但是C++写起来很快,就是运行有时候会很慢),所以学会在合适的时候选择合适的方法是一件重要的事情。其次就是掌握了控制台程序命令行输入参数的方法(   int main(int argc, char * argv[])   ),这在以前将C语言的时候虽然知道有,但是却不知道作用。

2.大一、大二两年,上过的课程确实很多,有C/C++,Java,HTML,python等等,但是感觉都是只学了基本语法和简单的函数,我感觉我现在连一个小软件都还写不出来。之前是在用C/C++做算法题目,只是一直在写控制台程序,没有使用什么界面,而且用不到什么内置函数,算法都是自己用最基本的语法敲出来的。所以实用性较小,而通过这种作业我学会了许多C语言里面的实用性较大函数。学过了许多门课程数据结构、算法、操作系统等等,一直都是各自为营,没有把这几种结合起来。

关于能力的话,我感觉我也就是对C/C++语言比较了解(感觉也只能称为了解),大概就是因为写算法题目的原因。这学期,我打算增强一下面向对象编程能力,重新再学一下java。

skill

技能

课前评估(0..9) 课后评估(0..9)

Programming:Comprehension

(程序理解)(如何理解已有程序,通过阅读,分析,debug)

3 4

Programming:Design

(架构设计,模块化设计,接口设计)

1 1
Programming:Test(单元测试、代码覆盖率) 2 1

Programming:Code Review/Code Quality

(代码复审/代码规范/代码质量)

2 4

Programming:Command line and files

(处理命令行参数和文件系统)

1 2

Programming Language(C/C++/C#/Java)

(pick one language)

3 4

Programming:cutting edge techn

(最新发现如C++11)

3 3

Fitting

原文地址:https://www.cnblogs.com/wudb527/p/9732283.html