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)が、

ErlangJavaよりも速くならない理由はどこにもありません。しかし、その奇妙な構文が人々を遠ざけ、普及と商用投資を妨げています。でも私はErlangが好きです。性能が重要なコンポーネントでの利用は少なくしますが、今後も致命的に重要なコンポーネントに使うつもりです。

とコメントした。Erlangが流行らないのは要は分かりにくいからとの事。

書き方にクセがあり難易度高めだけど、並行処理とか分散処理に向いていて、

これをRubyライクに分かり易くしたのがElixirだ。

Erlangが使われているところ
  • 電気通信企業
  • 広告ビッティングシステム
  • 金融機関

リライアビリティーは年間稼働率99.9999999%との事で、 年に31.54ミリ秒しかダウンしないようです。これは凄いですね。 元々電気通信系のシステムから発したという事で、 かけた相手にきちんと電話が繋がるっていうのは当たり前のように感じてますが、 裏でこういうシステムでしっかり構築されてるんですね。

Erlang http://www.erlang.org

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

アップデート中。しばしお待ち下さい