首先说测试,测试要考虑到的情况是很多的:我想到了下面的一些情况:
1、命令行参数输入的错误
2、输入的路径是否正确
3、路径下面为空
4、目录下面含有目录(可能含有多层)
5、是否能够对各种格式的文本文件进行操作
6、目录下面含有非文本文件
7、文本文件中含有中文字符
8、多种分隔符
9、需求中要求的是否能够达到,即对字符串的处理能否满足
10、大文本文件是否能够高效处理
对于前面的几个情况,测试的样例比较小,观察看到均能够正确地处理,在进行代码分析的过程中,有些情况显示没有捕捉到数据。我觉得这一点可能主要是和数据量有关。在最后的一个测试样例中,选择了一个大数据量的样本,总大小为891KB,希望看这种情况下的执行的数据,是否能够达到要求。
下面是一张性能分析得到的截图:
从这张图中能够看到执行的效率还是不错,当时这个没有和其它同学的进行对比。
这一张图为程序的调用关系,调用层次较浅
这个图截取了其中的一些函数的使用情况。
对于一个130MB的文件进行的测试结果如下:
执行效率仍然不够,花费的时间较长:
分析知,其中大量的时间放在了存储到SortedDictionary或者ArrayList中。
在程序写好之后,对程序所做的优化的时间大概就只有一个小时,而且主要是针对上面提到的一个情况,最开始程序执行的时候对于数据量小的时候速度还可以,但是当数据量稍微大一些以后,就发现速度就非常慢了,经过检查,发现是其中的一步写错了,主要就是在于每次添加到ArrayList中都要进行一个排序。而正常的逻辑就应该是将所有的数据都加入到ArrayList中以后,再进行排序,这样就浪费了大量的时间。期中一些具体的数据结构也会对具体的性能情况产生影响。比如对于C#中的Dictionary和SortedDictionary的选择,SortedDictionary对放到期中的元素按照键进行排序。SortedDictionary内部实现是一棵二叉搜索树,而Dictionary内部是采用的Hash算法,通过数组实现多条链式结构。两种结构各有优点,Dictionary对于添加和查找元素的速度都是非常好的。但是由于考虑到我需要排序过程中的使用,还是选择了SortedDictionary。这样我就避免了对于Dictionary的再次排序。
感想:
很久没有怎么写过代码了,再加上写的过程中,思考还没有怎么好的时候就开始动手写代码,然后就出现了写着写着就不知道该怎么写的情况。这一次我用的c#进行的开发,但是c#也不会,就花了一点时间简单地看了一下c#的一些东西,然后就是一边写代码,一边在网上查资料。然后查到了就基本上是直接将东西搬上去用,也没有怎么考虑过到底使用的效果怎么样,在这一点上我觉得还有很多改进的空间,需要了解一下C#以后,然后来改进。
其次,就是觉得这个项目应该是对于软件工程这门课来热身的,题目不难,但是应该建立一些软件工程的东西,代码分析,优化,测试,以前写代码的时候基本上都是为了完成某个题目,而这些题目往往都是有测试的,换句话说就是,我自己来想测试样例的时间太少了,测试的能力不够,一个好的项目是必须要足够的测试的。这样才能够保证最后不出问题。(当然,不出问题往往是不可能的,只是我们要尽量减少这些问题。)
这一次的小项目,还是感觉自己差的东西实在是有点多,从具体的语言,到算法设计的思想。都还应该好好地锻炼锻炼。