erlang的八个秘密
1. 复杂函数Funs较慢
funs的速度比apply/3要慢,它从实现机制上利用了编译器的小伎俩,速度上比apply/3使用元组和大量精巧设计来的慢。
2. 列表解析比较慢
在以前列表解析是使用funs的方式实现的,因此它的速度是非常慢的。
但现在使用递归函数实现,当然,采用尾递归函数,在末尾多加一个列表反转仍然要快很多。这在下一个秘密中会讲到。
3. 尾递归函数比普通递归函数要快得多
普通递归函数在堆栈上留下了废旧对象的指针,垃圾回收器需要将所有的废旧对象拷贝一份。而在尾递归函数中,原地开栈意味着废旧对象直接被弃掉了
以上是R7B 之前的版本的情况,在R7B 版本中,编译器运行一段代码,用空列表覆盖了指向废旧对象的指针,因此垃圾回收器不用将废旧数据一直保留了。
即便采用了上述优化,采用尾递归仍然要比普通递归函数快得多,为什么呢?
这就与递归函数被调用时占据了多少字节的堆栈有关系。在绝大多数情况下,一个普通递归函数会比一个尾递归函数开辟更多字节的堆栈,正因