13 个 退休的迷思
我们相信,以下已退休的迷思终于被真相取代了。
13.1 迷思:Fun 很慢
Fun 曾经非常慢,比 apply/3 还慢。最初,Fun 的实现仅仅是使用编译器技巧、普通元组、apply/3,以及大量的创造力。
但这已经是历史了。Fun 在 R6B 中得到了自己的数据类型,并在 R7B 中得到了进一步的优化。现在,Fun 调用的成本大约介于本地函数调用和 apply/3 之间。
13.2 迷思:列表推导很慢
列表推导曾经使用 Fun 来实现,在过去 Fun 确实很慢。
现在,编译器将列表推导重写成普通的递归函数。使用尾递归函数并在最后进行反转可能会更快。或者,它会更快吗?这让我们想到了尾递归函数比主体递归函数更快的迷思。
13.3 迷思:列表减法("--" 运算符)很慢
列表减法的运行时复杂度曾经与操作数长度的乘积成正比,因此当两个列表都很长时,它非常慢。
从 OTP 22 开始,运行时复杂度为 "n log n",即使两个列表都很长,操作也能快速完成。实际上,它比常用的解决方法更快,并且使用更少的内存,常用的解决方法是在使用 ordsets:subtract/2 进行减法之前将两个列表都转换为有序集合。