我正在阅读这篇关于如何用Ruby进行函数式编程的文章。
https://code.google.com/p/tokland/wiki/RubyFunctionalProgramming
我注意到的一个例子是:

# No (mutable):
output = []
output << 1
output << 2 if i_have_to_add_two
output << 3

# Yes (immutable):
output = [1, (2 if i_have_to_add_two), 3].compact

尽管“可变”选项由于更改数组的值而不太安全,但可变的选项似乎效率较低,因为它调用.compact这意味着它必须迭代数组以返回一个没有nil值的新数组。
在这种情况下,哪种选择更可取一般来说,您如何在不变性(功能性)和性能(在命令式解决方案更快的情况下)之间进行选择?

最佳答案

你没有错通常情况下,纯功能解决方案比破坏性解决方案要慢。不可变的值通常意味着需要进行更多的分配,除非语言对它们进行了很好的优化(Ruby没有)。
不过,这并不重要担心特定操作的性能并不能很好地利用99%的时间从一段每秒运行100次的代码中删减一微秒根本不是一个胜利。
最好的方法通常是做任何使代码最干净的事情。这通常意味着利用语言的功能特性,例如mapselect,而不是map!keep_if。然后,如果您需要加快速度,您就有了一个漂亮、干净的代码库,您可以对其进行更改,而不必担心您的更改会使一段代码在另一段数据上一脚踩过。

09-19 01:46