Scala 2.12.12がリリース!コンパイラやコレクションの性能向上に注目!

Scala 3.3.1
最終更新:2020年7月14日

[AD] scalapediaでは記事作成ボランティアを募集しています

日本時間の2020年7月14日(火)に、Scala 2.12.12 がリリースされました。
これに伴い、Scalapediaも即日 Scala 2.12.12 に対応しました。

この記事では、Scala 2.12.12 で行われたアップデートの内容について解説します。
コンパイラやコレクションの性能向上があるので、Scala 2.12系を使用している場合にはぜひアップデートしましょう。

主な更新内容は以下の通りです(「この記事のダイジェスト」をご覧ください)。
それでは、それぞれの変更について詳しくみていきましょう。

以前のScala 2.12系との互換性は維持されています

まず重要なのは、以前のバージョンとの互換性です。

今回の Scala 2.12.12 へのアップデートは、ほかの 2.12系リリースとバイナリ互換となっています。

バイナリ互換であるとは、異なるバージョンでコンパイルされたクラスどうしで依存関係がある場合にも、Linkage Errorが発生しないことが保証されている、つまり再コンパイルが不要であるということをいいます。

通常、Scalaのマイナーリリースはバイナリ互換となりますが、このリリースも通常通りバイナリ互換となっています。

immutable.{TreeSet, TreeMap}の性能向上に注目です

2.13系ではすでにimmutable.{TreeSet, TreeMap}に対して性能改善が行われています。

これらのクラスは、Scala 2.13 において赤黒木ベースの実装へと変更され、これにより処理性能が大きく向上しました。

今回のリリースでは、この性能改善を 2.12系へと移植(バックポート:backport)しています。

immutable.{HashMap, HashSet} のビルダーが効率化されました

immutable.{HashMap, HashSet} のビルダーがより効率的になりました。

Scala 2.13系ではすでにこれらのクラスに対して性能改善が行われており、今回の変更はこの改善をバックポートしたものです。

メモリ・チャーン(memory churn)を減らすため、構築の際にmutationを使用するようになりました。

ライブラリ「scala-async」がコンパイラレベルでサポートされました

Scala 2.12.12 においては、scala-asyncをコンパイラレベルでサポートしました。

scala-asyncとは???

scala-asyncとは、並列並行処理を手軽に実現するためのライブラリです。

SIP-22として提案されており、将来的にScala本体へと取り込まれることが計画されています。

scala-async はバージョン 1.0.0 が Scala 2.12.12 をベースにビルドされ、近いうちにリリースされる予定です。

外部リンク:GitHub scala/scala-async

具体的にどのような「コンパイラレベルのサポート」が入ったのか

コンパイラに対して、async/await DSL をScalaの Future へと変換するフェーズが追加されました。

この変換はこれまで scala-async においてマクロをベースに実装されていたのですが、これを改め、Scalaのコンパイラ内で行うようにしました。

さらに以下のような変更が入っています。

  • 懸案だったバグを修正する
  • コンパイルのオーバーヘッドを削減する
  • サードパーティのEffectsライブラリを手軽に扱えるようにする

コンパイラが性能向上しています

また、コンパイラについては若干の性能向上がありました。
コンパイラのメモリ割当率が10%改善しています。

たかが10%、されど10%です。
コンパイルに5分かかるなら約30秒の短縮が見込める、と考えるとけっこうな改善と言えるのではないでしょうか。
あるいはインクリメンタルコンパイルなどで日々積み重ねると、大きな差が生まれるでしょう。

まとめ

Scala 2.12.12 へアップデートすると、コンパイラやコレクションの性能向上など、多くのメリットがあります。
Scala 2.12系を使用している場合にはぜひアップデートしましょう。

Scala 2.12.12 に関するその他の更新については、リリースノートをご覧ください。

サイト内検索