Erlang 顺序型编程 练习 快速排序qsort 性能问题 及其他发现

手头有一本《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").”)。至于挂掉的深层原理,后续再探讨。

 

总结:

  1. 在一个列表尾部添加元素,比在列表头部添加元素效率要低很多。
  2. erlang自带的排序函数要比自定义的函数效率高很多。
posted @ 2010-12-27 09:59  侯宜安  阅读(1113)  评论(0编辑  收藏  举报