《软件工程》individual project开发小记(一)
今天周四没有想去上的课,早八点到中午11点半,下午吃完饭后稍微完善了一下,目前代码可以在dev c++和vs2012上正常运行,性能分析我看资料上一大坨,考虑到目前状态不太好,脑袋转不动了,决定先放一放去看看邹老师以前的软工博客以及学长学姐们的经验,现在这里稍微总结一下.
1) Before you implement this project, Record your estimate about the time you WILL spend in each component of your program.
做这个项目之前,因为之前从没有系统的进行过从需求分析到编码到性能分析的开发过程,所以对各项工作所预计的时间估计不足
需求分析
这项工作主要用来分析整个项目到底要做什么,每项工作的大致实现方式,预计是用半个小时左右的时间
编写代码
预计用3个小时左右的时间
性能分析
预计用1个小时左右的时间
2) After you had implemented this project, record the ACTUAL time you spent in each component of your program.
目前为止,需求分析和编码工作已经基本完成,然后所用的时间已经远远超出想象
现在是周五下午3:40分,我昨天晚上将代码完善了一下,采用了hash表的方法来存储word,对于每一个word利用大素数求一个hash值,对于hash值相同的word我用一个链表来存,为了实现word按照频度排序,最后将链表中的word都提取出来放入一个数组中进行关键字排序就好.这样时间复杂度接近O(1);我从花园上下了一个133M左右的英文txt小说合集作为测试样本,发现程序总是崩掉,后来终于发现是我的大素数不够大,存储空间太小,我将大素数改为50W以内的最大素数后顺利解决了这个问题
需求分析
前期的需求分析明显不足,导致许多工作在编码过程中需要补充,加上在整个编码过程中零零散散的一些时间,这项工作实际大概运行了90分钟左右
编写代码
编码中遇到的一个最大的问题是从dev c++上移植到vs2012,由于vs2012的代码安全性检查较为严格,而本次项目要求不出现warning,因此在许多地方都需要改用最新建议使用的函数,这里就花费了大量的时间查找函数说明;由于对vs2012的不够熟悉也花费了一些时间;还有一点就是对于word的存储,由于每当读入一个新的word时需要判重,我最初考虑是用map来实现,但代码编写过程中发现不会使用map对string和int两个关键字进行双关键字排序...这里牺牲了代码的效率最后改用了sort编写cmp函数,这个地方留到性能分析的时候考虑用更快的方法来实现.整个编码过程实际用时在270分钟左右.
以上是昨天总结的
昨晚我又对addword函数进行了重写,采用hash的方法,大概用了两个小时的时间;今天上课的时候在思考出错的原因,下午调试了一个小时左右
性能分析
预计用1个小时左右的时间
3) Describe how much time you spent on improving the performance of your program, and show a performance analysis graph (generated by VS2012 perf analysis tool), if possible, please show the most costly function in your program.
开始时我用遍历数组的方法判重,这样每次读入一个单词都需要O(n)的时间去查找显然不行,昨天晚上我想到了用hash的方法,编码+今天的调试大概用了5个小时的时间.
以下是我的performance analysis graph:


最占时间的应该就是Input函数了,它负责从目录中识别目的文件并读取,不过说实话这个性能分析自己还不太会用。。。好多dll文件怎么冒出来的还不太明白是什么东西..
今天是9月15日,我搜索了一下“无法查找或打开 PDB 文件”的解决方法之后得到如下性能分析图,感觉比以前慢了好多。。。难道是因为加载那些什么.dll文件么...不太懂.

深入分析函数性能

读文件夹还算不太占时间

最耗时的是读字符和将word加入的判重工作

就是这样。。
6:14分左右的时候。。。又跑了一遍。。。速度更快了。。分析原因是这样。。样本文件没有变,但由于之前的样本是放在深层的文件夹中,递归花了一些时间(这么有影响么。。)。。这次只有12S左右,nice .

4) Share your 10 test cases, and how did you make sure your program can produce the correct result. (programs with incorrect result will get 0 points, regardless of speed)
测试用例我自己设计了五组,test1用来测试各种文件类型,test2用来测试空文件夹,test3用来测试空文件,test4用来测试100M+的文件夹,test5模拟实际的文件夹结构+100M+文件夹,其他五组测试用例我决定使用其他同学的用例,通过与其他同学的代码结果对拍,我认为我的代码能够正确且比较高效的完成项目需求.
5) Describe what you had learned in this exercise.
1.学到的第一点就是递归遍历指定目录下的所有文件.以前只会单纯的用文件指针或者输入输出重定向来访问单个文件,而在这个项目中学到了在windows和unix下利用一些api来实现递归遍历指定目录下的所有文件.
2.学到了一些由于指针安全性而引发的vs2012的安全性检查,并了解了诸如strcpy,fopen等函数的替代函数
3.vs2012中一些问题的解决方法,例如:http://blog.csdn.net/chw1989/article/details/7482205
4.字符串哈希,尤其是学会了链地址法.
5.初步了解了vs2012进行preformance analysis.
PS:需求改了要提前说啊。。。今天刚刚看到需求又改了。。。
《软件工程》individual project开发小记(一)的更多相关文章
- 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题]
软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题] 首先,在分组之前,我和室友薛亚杰已经详细阅读了往届学长的博客,认为电梯调度 ...
- Individual Project - Word frequency program-11061171-MaoYu
BUAA Advanced Software Engineering Project: Individual Project - Word frequency program Ryan Mao (毛 ...
- 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]
软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] 说明结对编程的优点和缺点. 结对编程的优点如下: 在独立设计.实现代码的过程中不 ...
- NodeJS+Express+MySQL开发小记(2):服务器部署
http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...
- Note: SE Class's Individual Project
虽然第一个Project还有点小问题需要修改,但是大体已经差不多了,先把blog记在这里,算是开博第一篇吧! 1.项目预计的用时 本来看到这个题的时候想的并不多,但是看了老师的要求才觉得如此麻烦ORZ ...
- 带农历日历的DatePicker控件!Xamarin控件开发小记
原文:带农历日历的DatePicker控件!Xamarin控件开发小记 闲来无事开发了个日期选择控件,感兴趣的同学前往: https://github.com/MatoApps/Mato.DatePi ...
- 软件工程个人项目作业 Individual Project
利用Junit4进行程序模块的测试,回归测试 源码 https://github.com/dpch16303/test/blob/master/%E5%9B%9E%E5%BD%92%E6%B5%8B% ...
- 微软颜龄Windows Phone版开发小记
随着微软颜龄中文网cn.how-old.net的上线,她也顺势来到了3大移动平台. 用户在微软颜龄这一应用中选择一张包含若干人脸的照片,就可以通过云计算得到他们的性别和年龄. 今天我们就和大家分享一下 ...
- Individual Project Records
At the midnight of September 20, I finished my individual projcet -- a word frequency program. You c ...
随机推荐
- C++中静态数据成员
类的静态成员不能由类的构造函数来初始化.因为即使不存在类的任何对象时,类的静态成员依然存在并且可以被使用.类的静态成员也不能访问任何类的非静态成员. 类名和类对象都可以直接调用静态数据成员.因为静态数 ...
- python读取指定内存的内容
import ctypes as ct t = ct.string_at(0x211000, 20) # (addr, size) print t 最好不要用解释性语言来开发底层,一般用C.
- hdu 1805Expressions(二叉树构造的后缀表达式)
Expressions Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- nyoj------79拦截导弹
拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...
- EasyUI TreeGrid
数据格式1: { , "rows": [ { "id": 1, "name": "All Tasks", "b ...
- JavaScript之模块化编程
前言 模块是任何大型应用程序架构中不可缺少的一部分,模块可以使我们清晰地分离和组织项目中的代码单元.在项目开发中,通过移除依赖,松耦合可以使应用程序的可维护性更强.与其他传统编程语言不同,在当前Jav ...
- struts2视频学习笔记 01-02
网易云课堂-<struts2> 课时1 Struts2: WebWork2基础上发展而来,MVC框架,无侵入式设计. 提供了拦截器,类型转换器,支持多种表现层技术(JSP, freeMar ...
- 我的Github注册使用之旅
[个人介绍] 我是来自网络工程143班的姜金金,学号是1413042066.我没什么大的爱好,闲时喜欢在有阳光的午后喝喝小茶,捧一本书慢慢品茗:也喜欢散散步,欣赏细碎事物的美好,驻足沿路美丽的风景.说 ...
- 转载 Javascript继承两种形式详解
一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来分 ...
- mustache模板技术
一.简介Web 模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,通常是标准的 HTML 文档.当然不同的开发语言有不同模板引擎,如 Javascript 下的 Hog ...