【问题标题】:Imperative vs Functional Programming in RubyRuby 中的命令式编程与函数式编程
【发布时间】:2014-02-20 09:01:22
【问题描述】:

我正在阅读这篇关于如何以函数式风格使用 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 functional-programming immutability performance


    【解决方案1】:

    你没有错。通常情况下,纯功能解决方案会比破坏性解决方案慢。不可变的值通常意味着必须进行更多的分配,除非语言针对它们进行了很好的优化(Ruby 不是)。

    但是,这通常并不重要。 99% 的时间担心特定操作的性能并不能很好地利用您的时间。从一段每秒运行 100 次的代码中减少一微秒根本不是胜利。

    最好的方法通常是做任何让你的代码最干净的事情。这通常意味着利用语言的功能特性——例如,mapselect 而不是 map!keep_if。然后,如果您需要加快速度,您就有了一个漂亮、干净的代码库,您可以对其进行更改,而不必担心您的更改会使一段代码压倒另一段的数据。

    【讨论】:

    • 一般来说,@Chuck 所说的是有道理的。从另一个角度来看,考虑内存紧张和更好的性能意味着更好的电池寿命等的移动开发;例如,在 iOS 开发中,不可变的NSArrays 用于当您不需要修改数组时,它的子类NSMutableArray 可以在需要时使用。
    • @Abdo 在我看来,这个想法仍然存在于移动开发中。关键是您的大部分代码对程序的 CPU 使用的贡献微乎其微。考虑 80/20 的经验法则;如果 80% 的运行时间花费在 20% 的代码中,那么即使将其他 80% 的代码优化得如此之好,以至于您将其运行时间减少到零,也只会使您减少 20%您的应用程序的 CPU/电池消耗。编写/维护干净代码所节省的时间意味着即使性能是您的目标,您最好只花​​时间优化它产生影响的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2010-12-19
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多