[Elixir]Registerを覗く

key-value processとしてElixir1.4に入れる予定の Register というものが公開されました。

付属のベンチマークによると、以下のように高い性能が出ていることがわかります。

the result of https://github.com/elixir-lang/registry/blob/master/bench/

  • MacBook Pro (Retina, 15-inch, Late 2013)
  • OS: Mac OS 10.11.6
  • processor: 2.6 GHz Intel Core i7
  • memory: 16 GB 1600 MHz DDR3
  • Erlang/OTP 18
$ TASKS=8 MIX_ENV=bench mix run bench/erlang.exs
{835251, :ok}

$ TASKS=8 MIX_ENV=bench mix run bench/gproc.exs
{732408, :ok}

$ TASKS=8 MIX_ENV=bench mix run bench/registry.exs
{195402, :ok}

このベンチマークの内容は以下

https://github.com/elixir-lang/registry/blob/master/bench/shared.exs

プロセスを起動して、登録して。それを10000回登録する間の時間を計測しているみたいですね。
各ベンチマークの最後で登録した名前をチェックして、その欠損がないことを確認して終わり、と。

register/3 周りは以下

https://github.com/elixir-lang/registry/blob/master/lib/registry.ex#L535

ここら辺を見て回ると、 :ets テーブルを複数に分割(sharding)しているぽい。
同じようなことをしているものがあるのかなと調べてみると、以下のライブラリがすでに。

https://github.com/cabol/shards
https://github.com/cabol/exshards

プロセスを気軽に使えるように便利機能を拡充していく、という感じですかね。


おまけ

テストコード、繰り返しには以下のように fordescribetest を囲むことができるのですね。こう言う書き方もあるのねーという学びでした。

https://github.com/elixir-lang/registry/blob/master/test/registry_test.exs

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.