【问题标题】:Real world Clojure performance tuning tips?真实世界的 Clojure 性能调优技巧?
【发布时间】:2011-04-05 08:44:16
【问题描述】:

我看到 Clojure 应用程序的“某些”部分出现严重的减速。关于如何对 clojure 应用程序进行性能调优,有人有任何现实世界的提示吗?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    我的个人建议:

    • 首先检查你的算法 - 你是否会产生 O(n^2) 成本,而实际上应该是 O(n.log n)?如果你选择了一个糟糕的算法,那么剩下的调优就是浪费时间。
      • 请注意常见的“陷阱”,例如遍历列表/序列的 O(n) 成本。
      • 利用 Clojure 中的出色功能,例如复制大型持久数据结构的 O(1) 成本或访问映射/集/向量的 O(log32 n) 成本。
    • 明智地选择 Clojure 的核心结构:
      • 当您需要一些可变数据时,atom 非常有用,例如循环更新一些数据
      • 如果您要按顺序遍历某些数据,请使用 列表 而不是矢量或地图,因为这样可以避免在遍历序列时创建临时对象。
      • 在适当的地方使用 deftype/defrecord/defprotocol。从 Clojure 1.2 开始,这些都经过大量优化,尤其应该优先于 defstruct/multimethods。
    • 利用 Clojure 的并发功能:
      • 当您同时进行大量独立计算时,pmapfuture 都是利用多核的相对简单的方法。
      • 请记住,由于 Clojure 的不可变持久数据结构,制作和处理数据的多个副本非常便宜。拍摄快照时您也不必担心锁定.....
    • 如果您正在与 Java 代码交互,请使用“(set! *warn-on-reflection* true)”并消除每个反射警告。反射是最昂贵的操作之一,如果重复执行,它确实会减慢您的应用程序的速度。
    • 如果您仍需要更高的性能,请确定代码中对性能最关键的部分(例如,应用程序花费 90% 以上 CPU 时间的 5% 行),详细分析此部分并明智地应用以下规则:
      • 避免懒惰。懒惰是一个很棒的功能,但会带来一些额外的开销。请注意,Clojure 的许多常见序列/列表函数都是惰性的(例如 for、map、partition)。 loop/recur、dotimes 和 reduce 是你的非懒惰朋友。
      • 使用原始提示未经检查的算术使算术/数字代码更快。基元比 Clojure 的默认 BigInteger 算法快很多
      • 最小化内存分配 - 尽量避免创建过多不必要的中间数据(向量、列表、映射、非原始数字等)。所有分配都会产生少量的额外开销,并且随着时间的推移会导致更多/更长的 GC 暂停(如果您正在编写游戏/软实时应用程序,这可能是一个更大的问题。
      • (Ab) 使用 Java 数组 - 在 Clojure 中不是很惯用,但 aget / aset / areduce 和朋友的速度非常快(他们受益于大量 JVM 优化!!)。 (Ab) 使用原始数组获得额外奖励。
      • 使用宏 - 尽可能在编译时生成丑陋但快速的代码

    执行上述所有操作应该可以从 Clojure 代码中获得相当不错的性能 - 通过仔细调整,我通常能够相当接近纯 Java 性能,这对于动态语言来说是相当令人印象深刻的!

    【讨论】:

      【解决方案2】:

      您可以使用JVisualVM 对Clojure 代码进行分析(参见JVisualVM and Clojure 示例)。这至少应该为您指明慢速代码的正确方向。

      【讨论】:

      • 你有什么关于如何在 Clojure 中使用 VisualVM 的提示吗?我试过了,但是类的名称对我来说毫无意义?
      • 当我上次查看时(一段时间前),我发现方法名称非常易读 - 可能发生了一些变化。
      • 我想我的问题是类名与 clojure 名称不同,除非您使用记录
      【解决方案3】:

      这个问题涉及使用 Clojure 进行分析:Profiling tool for Clojure?

      我相信你会在那里找到一些很好的提示。

      然后直接从马嘴里:http://clojure.org/getting_started#Getting%20Started-Profiling

      【讨论】:

      • 感谢您的指点。我想目前还没有 Clojure 特定的工具,但我总是可以根据这些链接推出自己的工具
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多