软工个人作业
1.预测时间:
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
10分钟 |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
20分钟 |
· Design Spec |
· 生成设计文档 |
30分钟 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20分钟 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20分钟 |
· Design |
· 具体设计 |
40分钟 |
· Coding |
· 具体编码 |
5个小时 |
· Code Review |
· 代码复审 |
30分钟 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
1个小时 |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
1小时 |
· Size Measurement |
· 计算工作量 |
40分钟 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30分钟 |
合计 |
11小时 |
2.实际时间:
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
20分钟 |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
30分钟 |
· Design Spec |
· 生成设计文档 |
10分钟 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10分钟 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20分钟 |
· Design |
· 具体设计 |
40分钟 |
· Coding |
· 具体编码 |
6个小时 |
· Code Review |
· 代码复审 |
20分钟 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
1个小时 |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
20分钟 |
· Size Measurement |
· 计算工作量 |
10分钟 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10分钟 |
合计 |
10个小时 |
3.性能优化:
消耗最大的函数是StreamWriter.Flush(),这个函数,每次写入完成用来清空缓冲区,因为在生成10000个左右的式子时很可能缓冲区满而出现写入不完整的情况,所以每次写入一个式子我都会清空缓冲区。这个可以不使用缓冲区而直接写入来解决,然而这样的io操作可能会变慢。所以不进行改变。
优化前:
经过性能测试发现,最占用资源的函数是二元式类Two的toString 函数。跟入此函数发现,该函数会在每次调用时都根据类属性计算其字符串映射。然而此类是一个不可变对象,然而它的实例被构造后可能不会调用toString进行输出。所以,我们设置一类属性存储其字符串映射。并且,初始值为null,只有当第一次调用toString函数时才会计算其值,以后每次调用toString只要输出该属性就可以。
4.测试样例:
论证正确性:
我的生成算法可以由数学证明在线性生成过程中不会生成重复的表达式,证明如下:
首先定义元a,元集A。二元式b,二元式集B。运算符f,运算符集F。
A := 满足值域要求的 自然数、真分数 | B;
B := AFA;
F := ‘+’|’-’|’*’|’/’;
如果b1=a1 f1 a2,b2=a3 f2 a4属于B,则:
b1与b2不等价的充分条件是:
f1 != f2 或
f1 == f2 且 f1 == ‘+’ 或 ‘*’ ,(a1,a3) != (a3,a4) && (a1,a3) != (a4,a3)
由以上定义和推理我们可以归纳出不生成重复表达式的线性算法,即用所有一元构造狭义二元式(即两个一元和一个运算符组成),之后用狭义二元式和一元构造足够数目的广义二元式(即二元式本身也可作为元),只要在递归和迭代的生成过程中,任意二元式满足不重复的充分,则一定没有重复的二元式。
十个测试用例:
(额。。。这个是生成的文件。。。好像没法传文件啊。。。。)