以前的误区
误区1:Funs 运行速度很慢
fun曾经非常慢,比apply/3慢。最初,fun的实现仅仅是使用编译器的技巧、普通元组、apply/3以及大量的约定。
但那是历史。在R6B中,fun被赋予了自己的数据类型,并在R7B中进行了进一步的优化。现在,一个fun调用的消耗大约在普通的函数调用和apply/3之间。
误区2:列表解析很慢
列表解析过去是使用fun来实现的,在过去,fun确实很慢。
现在,编译器将列表推导式重写为普通的递归函数。使用尾部递归函数并在末尾执行反向操作会更快。还是吗?这就引出了一个误区:尾部递归功能比主体递归功能更快。
误区3:列表减法(“——”运算符)很慢
列表减法的运行时复杂度通常与操作数长度的乘积成正比,所以当两个列表都很长时,它的运行速度非常慢。
在OTP 22中,运行时复杂度是“n log n”,即使两个列表都很长,操作也会很快完成。事实上,它比常用的方法更快,使用更少的内存,在用ordersets减去它们之前将两个列表转换成有序集:subtract/2。