いくつかのベンチマークは遺伝子シーケンシングなどのerlangに完全に適合しているので、私はこれに興味を持った。したがって、http://benchmarksgame.alioth.debian.org/で最初に行ったのは、CとErlangの両方の逆補完の実装と、テストの詳細を確認することでした。erlangがVM/wスケジューラーを起動するのにかかる時間を割り引いていないため、テストに偏りがあることがわかりました。ネイティブにコンパイルされたCははるかに高速に起動されます。これらのベンチマークの測定方法は基本的に次のとおりです。
time erl -noshell -s revcomp5 main < revcomp-input.txt
ベンチマークによると、Javaは1.4秒、erlang / w HiPEは11秒かかりました。(シングルスレッド)Erlangコードの実行には0.15秒かかりました。仮想マシンの起動にかかる時間を割り引くと、実際のワークロードは3000マイクロ秒しかかかりませんでした( 0.003秒)。
だから私はそれがどのようにベンチマークされているのか分かりません、それが100回行われた場合、erlangVMを起動するコストはx100になるので意味がありません。入力が与えられたよりもはるかに長い場合、それは理にかなっていますが、そのWebページには詳細が表示されません。ベンチマークをマネージド言語に対してより公平にするために、コード(Erlang / Java)にUnixシグナルをPython(ベンチマークを実行している)に送信させ、スタートアップ関数にヒットさせます。
ベンチマークはさておき、erlang VMは基本的に、JavaVMと同様に最後にマシンコードを実行するだけです。したがって、ErlangではJavaよりも数学演算に時間がかかる方法はありません。
Erlangが苦手なのは、頻繁に変更する必要のあるデータです。連鎖ブロック暗号など。文字「0123456789」があるとします。暗号化により、最初の2文字が7で排他的論理和され、最初の2文字が加算された結果で次の2文字が排他的論理和され、次に現在の2文字が減算された結果で前の2文字が排他的論理和されます。次に、次の4文字を排他的論理和します。
Erlangのオブジェクトは不変であるため、これは、変更するたびにchar配列全体をコピーする必要があることを意味します。そのため、erlangは、この正確な問題を解決するために呼び出すことができるCコードであるNIFSと呼ばれるものをサポートしています。実際、Erlangに同梱されているすべての暗号化(ssl、aes、blowfish ..)と圧縮(zlib、..)はCで実装されており、ErlangからCを呼び出すことに関連するコストもほぼ0です。
したがって、Erlangを使用すると、両方の長所を活用でき、Erlangの並列処理でCの速度を得ることができます。
可能な限り最速の方法で逆補完を実装する場合、Cを使用してミューティングコードを記述しますが、Erlangを使用して並列コードを記述します。無限の入力を想定すると、Erlangを分割して>
<<Line/binary, ">", Rest/binary>> = read_stream
ラウンドロビンを介して最初に利用可能なスケジューラーにブロックをディスパッチします。ラウンドロビンは、ミリ秒ごとにクラスターにリアルタイムで追加される、無限のEC2プライベートネットワーク隠しノードで構成されます。
次に、これらのノードは、処理のためにNIFSを介してCに呼び出し(Cはalioth Webサイトでの逆コンパイルの最速の実装でした)、出力をノードマスターに送り返して、入力者に送信します。
これらすべてをErlangで実装するには、シングルスレッドプログラムを作成しているかのようにコードを作成する必要があり、このコードを作成するのに1日もかかりませんでした。
これをJavaで実装するには、シングルスレッドコードを作成する必要があります。マネージドからアンマネージドへの呼び出しのパフォーマンスヒットを取得し(明らかにうなり声の作業にC実装を使用するため)、サポートするように書き直します。 64コア。次に、複数のCPUをサポートするように書き直します。次に、クラスタリングをサポートするためにもう一度書き直します。次に、メモリの問題を修正するためにもう一度書き直します。
そしてそれは一言で言えばErlangです。