Elixir vs Golang スループット対決
Elixirとは
読み方はエリクサー。
Erlangという言語で実装されている。Rubyライクな文法で書ける。
Elixir (日本語) http://elixir-ja.sena-net.works
Elixir(本家)http://elixir-lang.org
Erlangとは
読み方はアーラン。Elixirの元になった言語。
Erlangは1986年にJoe Armstrong, Robert Virding, Mike Williams の3人によって最初のバージョンが作られた
「ジョー」と「ロバート」と「マイク」が俺らで時代変えてやろうぜ!AhHa?っていって(私の勝手なイメージ)、一念発起して開発した言語がErlang。
モノはいいのに流行らなかった。ある日、デミアン(Damien Katz)が、
ErlangがJavaよりも速くならない理由はどこにもありません。しかし、その奇妙な構文が人々を遠ざけ、普及と商用投資を妨げています。でも私はErlangが好きです。性能が重要なコンポーネントでの利用は少なくしますが、今後も致命的に重要なコンポーネントに使うつもりです。
とコメントした。Erlangが流行らないのは要は分かりにくいからとの事。
書き方にクセがあり難易度高めだけど、並行処理とか分散処理に向いていて、
これをRubyライクに分かり易くしたのがElixirだ。
Erlangが使われているところ
- 電気通信企業
- 広告ビッティングシステム
- 金融機関
リライアビリティーは年間稼働率99.9999999%との事で、 年に31.54ミリ秒しかダウンしないようです。これは凄いですね。 元々電気通信系のシステムから発したという事で、 かけた相手にきちんと電話が繋がるっていうのは当たり前のように感じてますが、 裏でこういうシステムでしっかり構築されてるんですね。
Elixir vs Golang 並列処理対決
Elixirも並列処理が得意という事で、 GolangにもGOルーチンという並列処理を容易に行う仕組みがあります。 今回はこの2つの言語で並列処理をさせ、どちらがスループットが出るか検証してみたいと思います。
Erlangインストール
まずは、インストールするところから始めます
[vagrant@localhost ~]$ sudo yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf [vagrant@localhost ~]$ wget http://www.erlang.org/download/otp_src_18.0.tar.gz [vagrant@localhost ~]$ tar zxvf otp_src_18.0.tar.gz [vagrant@localhost ~]$ cd otp_src_18.0 [vagrant@localhost ~]$ ./configure [vagrant@localhost ~]$ make [vagrant@localhost ~]$ sudo make install
動作確認
[vagrant@localhost otp_src_18.0]$ erl Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false] Eshell V7.0 (abort with ^G) 1>
無事インストールできたようです
Elixirインストール
[vagrant@localhost otp_src_18.0]$ wget https://github.com/elixir-lang/elixir/releases/download/v1.2.3/Precompiled.zip [vagrant@localhost otp_src_18.0]$ sudo unzip Precompiled.zip -d /opt/elixir [vagrant@localhost otp_src_18.0]$ export PATH=/opt/elixir/bin:$PATH
動作確認
[vagrant@localhost otp_src_18.0]$ iex Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false] Interactive Elixir (1.2.3) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> IO.puts "hello" hello :ok iex(2)>
Elixirもインストール出来ました。
環境
言語 | バージョン |
---|---|
Elixir | 1.2.3 |
Golang | 1.6 |
検証方法
サブルーチンで10000回ループするだけの処理を10000回並走させ、スループットを計測したいと思います。
サンプルコード
loop.go
package main func main() { for i := 0; i < 10000; i++ { go func() { run() }() } } func run() { for i := 0; i < 10000; i++ { } }
loop.exs
アップデート中。しばしお待ち下さい
検証
loop.go
[vagrant@localhost work]$ time go run loop.go real 0m0.182s user 0m0.148s sys 0m0.026s [vagrant@localhost work]$ time go run loop.go real 0m0.177s user 0m0.138s sys 0m0.037s [vagrant@localhost work]$ time go run loop.go real 0m0.164s user 0m0.129s sys 0m0.031s [vagrant@localhost work]$ time go run loop.go real 0m0.155s user 0m0.116s sys 0m0.035s [vagrant@localhost work]$ time go run loop.go real 0m0.171s user 0m0.142s sys 0m0.025s
loop.exs
アップデート中。しばしお待ち下さい