ClojureScript

コンパイル/実行速度の向上と Spec キャッシングの修正

2017年6月27日
ClojureScript チーム

ClojureScript 1.9.660 リリースには、いくつかの刺激的なパフォーマンス向上が含まれています。コンパイラ自体の速度を向上させるもの、コンパイラによって生成されるコードを最適化するもの、データ構造とそれらに対する一般的な操作を微調整するものなどがあります。

コンパイラのパフォーマンス

2つの小さな変更により、コンパイラはClojureScriptコードをはるかに高速にコンパイルするようになりました。ユーザーからは、コンパイル時間が 20〜40% 高速になったと報告されています。

デフォルトでは有効になっていない `:parallel-build` を試してみてください。これにより、コンパイル時間をさらに半分に短縮できます。

コードのパフォーマンス

  • `:^const` Var 値がインライン化されるようになりました

  • `sort`、`shuffle` が 30〜40% 高速化されました(`to-array` の最適化による)

  • `apply` が 200〜400% 高速化されました

  • `defmulti` が、ミスが発生した場合に大幅に高速化されました(200〜1000%)

  • set と map の等価性が 100〜200% 高速化されました

  • set と map に対する `reduce` が約 100% 高速化されました

正確性

多くの正確性の修正が行われ、そのうちのいくつかは ClojureScript の動作を Clojure の動作により近づけました。その他の重要な修正は、コンパイルキャッシュに関して行われました。特に、Specs を定義するコードは、キャッシュが有効になっている場合に正しく機能するようになりました。

**注意**: このリリースでは、プロトコルメソッドの実装で可変長引数シグネチャを使用する誤ったコードに対する新しい警告が導入されています。このようなコードは、このリリースでは引き続き機能します。プロトコル実装が既存のシグネチャと一致するように、この構造体を使用するコードまたはライブラリを更新してください。

新機能

  • 新しい `resolve` マクロ - Clojure の `resolve` と同様ですが、コンパイル時に行われます

  • モジュールはワイルドカード名前空間をサポートするようになりました

  • 新しい Closure 言語オプション `:es-2017`、`:es-next`

  • 新しいコンパイラオプション `:fn-invoke-direct` (`:static-fns` のさらなる最適化拡張)

  • `js/Promise` やその他の多くの ES 機能を使用し、Google Closure Compiler にポリフィルを生成させることができます(`:rewrite-polyfills` コンパイラオプション)

このリリースをぜひコードで試して、パフォーマンスを確認してください!このリリースを楽しんでいただければ幸いです!

ClojureScript 1.9.660 の更新の完全なリストについては、変更履歴 を参照してください。