2024 Clojure 状况调查!中分享您的想法。

欢迎!请参阅关于页面,以了解有关该功能的一些更多信息。

0
ClojureScript
对于{{simple-ident?}}、{{qualified-ident?}}、{{simple-symbol?}}、{{qualified-symbol?}}、{{simple-keyword?}}和{{qualified-keyword?}}函数,我们可以进行一些优化。

可以进行两次单独的优化。

在{{boolean}}使用的地方({{qualified-}}函数),我们可以使用{{some?}}进行更快的实现


(boolean (and (symbol? x) (namespace x) true))


可以转换为简单形式:


(and (symbol? x) (some? (namespace x)))


目前只关注V8,对于


(simple-benchmark [x 'a/b f #(qualified-symbol? x)] (f) 100000000)


减去基准成本


(simple-benchmark [x 'a/b f (fn [] x)] (f) 100000000)


得到1.74的速度提升。

由于我们应用{{namespace}}时知道正在处理关键字或符号,因此我们可以进一步使用{{(.-ns x)}}。

仅此就给出了2.21的速度提升,并且与之前的优化结合


(and (symbol? x) (some? (.-ns x)))


我们看到了接近无限的速度提升(该操作实际上成为免费,与基线相同的时间)。

请注意,我们可能可以使用由谓词诱导的类型推断及一个新的用于{{namespace}}的宏,它发出{{.-ns}},但CLJS-2866目前依赖于在{{if}}中查看测试,而上述表达式会造成带有短路{{&&}}的优化{{js*}}输出。

这些优化将是有益的,因为这些函数通常用于基于规范生成的代码测试中,其中可能存在性能问题。

我们在{{cljs.predicates-test}}中对这些函数进行了测试覆盖。

以下是目前的{{qualified-symbol?}}生成的JavaScript代码


function cljs$core$qualified_symbol_QMARK_(x) {
  return cljs.core.boolean$(
    (function() {
      var and__8540__auto__ = x instanceof cljs.core.Symbol;
      if (and__8540__auto__) {
        var and__8540__auto____$1 = cljs.core.namespace(x);
        if (cljs.core.truth_(and__8540__auto____$1)) {
          return true;
        } else {
          return and__8540__auto____$1;
        }
      } else {
        return and__8540__auto__;
      }
    })()
  );
}


以下是修订后的代码:


function cljs$user$qualified_symbol_QMARK_(x) {
  return x instanceof cljs.core.Symbol && !(x.ns == null);
}


(这个修订实施方案的紧凑性意味着它可能可以通过Closure进一步内联以实现更快的整体程序优化。))

9 个回答

0

评论者:mfikes

注意,Chris 提交了 CA(与@hlprmnky相同https://twitter.com/hlprmnky/status/1043661374830911489

0

评论者:cjbidler

补丁包含了在工单中概述的更改。所有测试均通过。

0

评论者:mfikes

Chris,请附上一个修订过的补丁,它不会更新 * } 的 {{def}}。 (您可以将补丁命名为 CLJS-2920-2.patch,并且它应该是一个独立的补丁,不依赖于之前的补丁。)

0

评论者:cjbidler

按照指示执行;感谢指出这一点。为了将来参考,在运行 lein uberjar 后重置那个 def 是一个手动清理步骤吗?如果我可以自动调整以防止在未来的补丁提交中出现此类错误,我会非常感激。 :D

0

评论者:mfikes

我不知道有一个自动删除 * } 修订的机制。我通常只是在提交中尽量避免放置此特定的更改。

0

评论者:mfikes

CLJS-2920-2.patch LGTM 并通过所有金丝雀测试。

0

评论者:mfikes

CLJS-2920-2.patch 不再适用

0

评论者:mfikes

实际上,如果包含{{3way}}选项,补丁应用正常,因此无需重置基线。

0
...