编译器优化的功能代码比命令代码执行得更好的示例

问题描述 投票:28回答:4

[无副作用,referentially transparent功能编程的承诺之一是可以广泛优化此类代码。引用Wikipedia

数据的不可变性在很多情况下,通过允许编译器做出以命令式语言进行的不安全假设,从而[[增加内联扩展的机会,可以提高执行效率。

[我想看看通过生成更好的优化代码,功能语言编译器胜过命令式编译器的示例。

Edit:我试图给出一个特定的场景,但是显然这不是一个好主意。因此,我将尝试以另一种方式进行解释。

程序员将想法(算法)翻译成机器可以理解的语言。同时,翻译的最重要方面之一就是人类也可以理解所生成的代码。不幸的是,在许多情况下要进行权衡:简洁易读的代码性能低下,需要手动优化。这很容易出错,很耗时,并且使代码的可读性降低(甚至完全不可读)。

功能语言的基础,例如不变性和引用透明性,使编译器可以执行广泛的优化,从而可以代替手动的代码优化,并使程序员摆脱这种取舍。我正在寻找想法(算法)及其实现的示例,例如:

    (功能性)实现非常接近最初的想法,并且易于理解,
  1. 它已被语言的编译器广泛优化,并且
  2. 很难(或不可能)以命令式语言编写类似高效的代码,而无需进行手动优化来降低其简洁性和可读性。
  • 我很抱歉,不过我希望这个主意很清楚。我不想对答案进行不必要的限制。如果有人知道如何更好地表达它,我愿意提出建议。

    我的兴趣不只是理论上的。我想用这样的例子(除其他外)来激发学生对函数式编程产生兴趣。

    起初,我对评论中建议的一些示例不满意。再次考虑后,我将我的异议带回去,这些都是很好的例子。请随时将其扩展为完整答案,以便人们可以对其进行评论和投票。


    (这类示例中的一类最有可能是并行化的代码,可以利用多个CPU内核。通常在功能语言中,可以很容易地做到这一点,而无需牺牲代码的简单性(例如在Haskell中,在适当的位置添加par or pseq)我也对此类示例感兴趣,但对其他非并行示例也很感兴趣。)
  • performance haskell optimization functional-programming imperative-programming
    4个回答
    21
    投票
    在某些情况下,在纯上下文中,相同的算法会更好地进行优化。具体来说,par允许由一系列循环组成的算法,这些循环的形式可能多种多样:映射,过滤器,折叠,展开将组成单个循环。

    5
    投票
    [Geoff Continental,Simon Peyton Jones,Simon Marlow,Roman Leshchinskiy(提交给ICFP 2013)的最新论文pseq描述了这样的例子。摘要(其中有趣的部分以粗体显示):

    3
    投票

    0
    投票
    © www.soinside.com 2019 - 2024. All rights reserved.