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
プロセスを気軽に使えるように便利機能を拡充していく、という感じですかね。
おまけ
テストコード、繰り返しには以下のように for で describe や test を囲むことができるのですね。こう言う書き方もあるのねーという学びでした。
https://github.com/elixir-lang/registry/blob/master/test/registry_test.exs