【问题标题】:Is there a significant performance difference between running `explain-data` and `valid?`运行“解释数据”和“有效”之间是否存在显着的性能差异?
【发布时间】:2020-04-15 17:17:07
【问题描述】:

运行explain-datavalid? 之间是否存在显着的性能差异。

例如,我有这个代码

(let [is-valid? (spec/valid? ::SpecitySpec the-map)
      _ (when-not is-valid?
          (throw (ex-info "the-map doesn't match spec"
                          {:explain-data (spec/explain-data ::SpecitySpec the-map)})))])

如果是happy path,那么它只会运行valid?

不过,为简洁起见,我的偏好是:

(let [explain-data (spec/explain-data ::SpecitySpec the-map)
      _ (when explain-data
          (throw (ex-info "the-map doesn't match spec"
                          {:explain-data explain-data}))

但是,如果对 explain-data 的性能影响更大,那么我认为第一个示例会是最好的。

【问题讨论】:

    标签: clojure clojure.spec


    【解决方案1】:

    您可以回答自己的问题!

    只需使用clojure.core/time 来衡量两个选项的执行速度。如果你真的想要第二个版本,你可以很容易地编写一个宏来将代码从 #2 转换为 #1 的代码。一个好名字可能是validate-spec 或类似名称。

    你可能也对这个关于writing macros的问题感兴趣。

    【讨论】:

      【解决方案2】:

      我在 Clojurians Slack #clojure-spec 频道中发布了这篇文章,并获得了 answer from Alex Miller。他是这样说的:

      它们最终都调用了相同的函数,所以我希望 perf 能够 现在很相似。我们考虑过快速路径 分开有效吗?虽然规范 2 中的路径,但我希望它是 更快的选择。

      最大的区别是 a) 使用 valid?,你可以快速失败 b) 有了解释,你必须跟踪很多额外的信息和 积累起来报告

      【讨论】:

        猜你喜欢
        • 2012-09-22
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 2014-05-17
        • 2012-08-21
        • 2014-02-23
        • 2010-10-02
        • 1970-01-01
        相关资源
        最近更新 更多