ClojureScript

编译/运行时加速和 Spec 缓存修复

2017 年 6 月 27 日
ClojureScript 团队

ClojureScript 1.9.660 版本包含一些激动人心的性能增强。部分改进加速了编译器本身,部分优化了编译器生成的代码,还有一些改进微调了数据结构和常见的操作。

编译器性能

通过两个小的改动,编译器现在可以更快地编译 ClojureScript 代码。用户反馈显示编译时间提高了 20–40%。

别忘了尝试 :parallel-build,该选项默认未启用。这可以进一步将编译时间缩短一半。

代码性能

  • :^const Var 值现在被内联

  • sortshuffle 现在快了 30-40%(得益于 to-array 优化)

  • apply 快了 200-400%

  • defmulti 现在在未命中情况下快了很多(200-1000%)

  • 集合和映射的等价性快了 100-200%

  • reduce 在集合和映射上的速度快了约 100%

正确性

已经修复了许多正确性问题,其中一些问题使 ClojureScript 更加符合 Clojure 的行为。其他重要的修复涉及编译缓存;值得注意的是,定义 Spec 的代码现在在启用缓存时可以正常工作。

注意: 此版本为使用可变参数签名在协议方法实现中引入了一个新的警告。此类代码将继续在此版本中工作。请确保更新使用此构造的任何代码或库,以便协议实现匹配某些现有签名。

新特性

  • 一个新的 resolve 宏 - 类似于 Clojure 的 resolve,但在编译时执行

  • 模块支持通配符命名空间

  • 新的 Closure 语言选项 :es-2017:es-next

  • 一个新的编译器选项 :fn-invoke-direct(对 :static-fns 的进一步优化扩展)

  • 你可以使用 js/Promise 和更多 ES 特性,并让 Google Closure Compiler 生成 polyfills(:rewrite-polyfills 编译器选项)

你应该在你的代码上尝试一下这个版本,看看它的性能!我们希望你喜欢这个版本!

有关 ClojureScript 1.9.660 版本更新的完整列表,请参见 更改