アーランの特徴
以下からのErlangプログラミング(2009):
Erlangの並行性は高速でスケーラブルです。そのプロセスは軽量であり、Erlang仮想マシンは、作成されたすべてのプロセスに対してOSスレッドを作成しません。これらは、基盤となるオペレーティングシステムに関係なく、VMで作成、スケジュール、および処理されます。その結果、プロセスの作成時間はマイクロ秒のオーダーであり、同時に存在するプロセスの数とは無関係です。これをJavaおよびC#と比較してください。すべてのプロセスについて、基盤となるOSスレッドが作成されます。Erlangが両方の言語よりもはるかに優れているため、いくつかの非常に競争力のある比較が得られます。
同時実行アーラン(PDFファイル)に指向プログラミング (スライド)(2003年):
Erlangプロセスの作成にかかる時間は1µsから2,500プロセスまで一定であることがわかります。その後、最大30,000プロセスで約3µsに増加します。JavaとC#のパフォーマンスは、図の上部に示されています。少数のプロセスでは、プロセスの作成に約300µsかかります。2,000を超えるプロセスを作成することは不可能です。
最大30,000プロセスの場合、2つのErlangプロセス間でメッセージを送信する時間は約0.8µsであることがわかります。C#の場合、メッセージごとに約50µs、最大プロセス数(約1800プロセス)までかかります。Javaはさらに悪く、最大100のプロセスでメッセージあたり約50µsかかった後、約1000のJavaプロセスがあるとメッセージあたり10msに急速に増加しました。
私の考え
Erlangプロセスが新しいプロセスの生成においてはるかに効率的であり、プロセスごとのメモリフットプリントがはるかに小さい理由を技術的に完全には理解していません。OSとErlang VMの両方は、スケジューリング、コンテキストスイッチを実行し、レジスタの値を追跡する必要があります。
単に、OSスレッドがErlangのプロセスと同じ方法で実装されていないのはなぜですか?彼らはもっと何かをサポートする必要がありますか?そして、なぜ彼らはより大きなメモリフットプリントを必要とするのですか?そしてなぜ彼らは産卵とコミュニケーションが遅いのですか?
技術的に、スポーンと通信に関して、ErlangのプロセスがOSスレッドよりも効率的であるのはなぜですか?また、OSのスレッドを同じ効率的な方法で実装および管理できないのはなぜですか。また、OSスレッドのメモリフットプリントが大きく、生成と通信が遅いのはなぜですか?
もっと読む
- SMPに焦点を当てたErlang VMの内部(2008)
- JavaとErlangでの並行性(pdf)(2004)
- JavaのスレッドとErlangのプロセスのパフォーマンス測定(1998)
erl +P 1000100 +hms 100
し、タイプして{_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
、結果が出るまで約3分待ちます。それはとても簡単です。それは私のラップトップ上でプロセスごとに140usと1GBの全RAMを必要とします。しかし、それは直接シェルを形成するものであり、コンパイルされたコードからより良いはずです。