您的位置:首页 > 其它

个人项目总结 by Bin Xia

2012-09-03 13:33 211 查看
本次的个人项目是一个统计词频最高的100词的小程序。

程序的实现并不复杂,简单做了一个设计就开始写。整体架构采取 输入处理+hashtable建立+建立和维护堆+输入4个部分。从周一布置完作业,到周三完成,一共的时间在5-6个小时,附上上交文档的结果和分析:

Compare the final result and the expectation, there do be some different as following:

1. BuildHashTable

Expectation:

Size: 200 lines

Time cost: half word day

Possible Function: CommandAnalyze, FileVist,HashTableAdd

In reality:

Size: 28 lines….

Time cost: one hour

Why: use RegEx to select words and HashTable in System.collection

2. RankSys

Expectation:

Size: 300 lines

Time cost: one day

Possible Function: CommandAnalyze, FileVist,HashTableAdd

In reality:

Size: 2 lines+85 lines

Time cost: two hours

Why: over condition

3. PrintResult

Expectation:

Size: 50 lines

Time cost: 1 hour

Possible Function: PrintResult

In reality:

Size: 11 line

Time cost: 10 minutes

Why: almost right

Overall, I used 4 hours for coding and 1hour for testing. All codes contain 178 lines. It is to my surprise. The reason that I save so much time and codes is that I use HashTable in system.collections, so that I do not need to write the hash table myself. Also I use the RegEx to help me select the “words” which save me much time and work.

It is the first time that I try to evaluate the time and lines about my coding, and seems that I was too conservative. I guess I need more practice to find out my true ability of coding!

然而周末殷老师看过我的程序之后,在第二周的周一给我提了一些建议。主要是在读入参数的格式和细节优化上。于是然后我在之后对第一个版本进行了一些修改。具体update和结果,分析如下:

8/21/2012 Update:

增加了递归寻找目录下所有子目录和文件

修改程序读入为命令行参数读入,而非ReadLine读入

重写单词匹配部分,原匹配为正则表达式匹配,效率很低,新版重写匹配方式。

之前发的为debug版,这次改为release版。

增加大小写模糊(这点值得商榷,在实际测试中,大小写敏感的程序会稍微快一点。从分析来看,模糊减小了hashtable的规模和比较时间,但是由于输入为自然语言,总的词数有限,大写也只会出现在单词的首字母这一种情况。自然语言的hashtable大小本来就有限,而大小写模糊对其减小不大,但是却要增加一倍的IO(每个字符判断大小写),所以造成二者相差不大。如果在随机数据上,模糊大小写效果可能会好很多。由于针对输入相差不过一秒,所以我选择保留大小写模糊)

(多线程优化没有加入,因为程序主要时间在IO和hashtable,多线程对物理磁盘的磁头读入没有提升,hashtable的建立和文件读入同步,也不会有大的提升,反而合并需要加大开销,所以没有加入)

经过优化,对于novel的数据analyze的结果从160s狂减到36s(8核i7 870+8g内存),效果比较令人满意

PS:我觉得数据的要求应该再强一些,从分析来看所有的时间都花在了OI读入和hashtable的部分,而重要的选择top100的过程所有的时间非常少。分析来看,因为100太小,所以在top100近乎稳定的情况下,这100个数的变化很小,所以对于maintain这个list的代价也变得很低。虽然我用了堆(o(n*log 100))实现,但是分析起来和链表往后推(o(n*100))甚至每次排序(o(n*100^2)的复杂度差别不大,因为冲突的部分太少。所以对时间的缩小全部集中在hashtable的建立和对IO的优化上了。

总结:这次的个人项目对我的锻炼意义很大。

其一、我刚刚用c#几周,这次的项目给我了一个很好的更深入了解c#的机会,也让我对c#独有的一些内部变量函数有了更深的理解。比如arraylist,以及我直接使用的hashtable,都给我在编程中带来了极大的便利

其二、从这个项目中我第一次学会了使用性能分析。正是通过性能分析,我发现了我第一个版本中最耗时间的部分—单词匹配。由于之前使用正则表达式,所以效率非常低,占用的时间超过程序整体时间的90%。于是我重写了这个部分,果然程序的时间有了立竿见影的下降。这对我之后对程序的优化和修改都有很好的帮助。

其三、在整个项目的进行过程中,我明白了沟通和交流的重要性。一定要问清楚需求,问清楚要求,再开始设计。这也是我后来改一个版本的最重要的原因。但是如果这个项目是要发布的,可能就没有那么多时间给你修改了。所以在设计的时候就一定要明确,小心。

之后的 项目又要来了,希望我能在之后的项目中得到更好的锻炼。

Bin Xia
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: