Think Distributed

Database and Distributed Systems

Erlang OTP 22 で性能改善された点

Retiring old performance pitfalls – A Blog from the Erlang/OTP team – The Erlang/OTP team at Ericsson, the implementors and maintainers of Erlang/OTP.

  • 名前付き関数
    • 名前付き関数(関数内での名前を付けたクロージャー)の呼出をコンパイラは関数内に関数を定義する(make_fun2)挙動をしていたが、メモリ使用量とランタイムの実行コストで不利なので、直接関数を呼び出すようになった。
  • 巨大なリストに対する subtraction-
    • もともとはネストしたループとして処理するアルゴリズムだったが、最初に red-black tree を構築して処理するようになった。
    • 赤黒木を使うようになったため、最悪時 O(n^2) から O(logN) に計算量が改善された。
    • リストの引き算(subtraction)は ERTS のスケジューラーの協調処理を阻害する関数の1つなので、スケジューラーの専有時間が減って嬉しい。
  • ビットシンタックスの先読みでのマッチ
    • SSA(Static Single Assignment) ベースで OTP が書き直されていて、より多くのケースで先読みによるマッチの最適化が適用可能になった。
    • コンパイラはバイナリに対するマッチングで部分バイナリを生成するわけではなく "match context reuse" というテクニックを使って性能を上げているらしい。
      • match context はビットシンタックスに対するマッチを判定する時にコンパイラ内部で生成するマッチ用状態オブジェクトのこと。
      • たぶんバイナリに対するマッチの開始位置とかを保持しているのだと思う。