手头有一本《Erlang程序设计》(Programming Erlang Software for a Concurrent Word)。08年看草草看过一下。最近有空,打算以打阵地战的方式看此书。边看,边练习。
顺序型编程的章节中,有快速排序的示例代码,如下qs1:
书中提到,这段代码比较简洁、易懂,但是效率不好,除此之外,还发现了更严重的问题。(见后续的测试。)
既然这种方式不是最优,就参考网上找的例子(http://en.literateprograms.org/Quicksort_(Erlang)很不错的网站)另外写了一个快速排序qs2,两个实现方式同写在qsort模块中。
对应的测试代码。性能测试部分加入了lists模块自带的sort函数,做对比。
在性能测试中,如果对5000各元素的列表进行排序,结果如下
明显qs2的性能优于qs1,而lists模块自带的sort函数耗时更短。
如果用更大的列表(例如10000个元素的)去测试,则,qs1会挂掉(“Crash dump was written to: erl_crash.dumpeheap_alloc: Cannot allocate 583848200 bytes of memory (of type "heap").”)。至于挂掉的深层原理,后续再探讨。
总结:
- 在一个列表尾部添加元素,比在列表头部添加元素效率要低很多。
- erlang自带的排序函数要比自定义的函数效率高很多。