7種類の言語のパフォーマンス

例えば、WEBアプリを作成しようとすると、まずは言語が決まり、その言語のフレームワークを決め、その上で、DBなどを決めて、コーディングが始まるのだと思うのですが、そのWEBアプリケーションの中に複数の言語を混在させることは希です。

まあ、当然です。複数の言語をやっていると、プログラマーは混乱して、Javaをコーディングしているのに変数に「$」をつけて、Eclipseが怒っている、なんてことが起こるからです(それは僕ですw)。

ただ、一方で、ある処理をしたいときに、どうしても選択した言語ではパフォーマンスが出ないとか、画像処理をしたいのに目的のような処理ができるライブラリがみつからないとか、そのような面倒な局面というのが時々あります。

そこで、今回は各言語において、色々な処理の各言語のパフォーマンスを計ってみて、今後のパフォーマンスの知見にしようと最近チマチマ試験をしてみました。そうすれば、もしかしたら今後役に立つかも(本当に「かも」ですが)というわけです。

ただ、色々な条件、例えば、言語自体のコンパイルオプションの違い、プログラムのロジックなど様々な要因で結果が変わる可能性がありますの、あくまでも、ざっくりとしたものになってしまいますが、ご容赦下さい。

さて、試験で留意したのは次のことです。

  1. 実験機はIntel(R) Core(TM) i7-3770 @ CPU 3.5GHz
  2. 実験機のメモリーは16G
  3. 実験機のOSはCentOS6.3
  4. 言語は次の7つ。各言語は比較的新しいヴァージョンにする(Javaは1.6内で)。
    1. Sun Java 1.6.0_37
    2. C++ 4.4.6
    3. Perl 5.16.1
    4. Python 3.3.0
    5. PHP 5.4.12
    6. Ruby 1.9.3
    7. Node.js 0.8.14
  5. DBの試験ではPostgreSQLを利用。
  6. C++とNode.jsはコーディング的に危ないかも(すみません、素人なので)
  7. C++コンパイルオプションに「-03」でコンパイル
  8. 4回試験して、1回目を捨てて、後半3回分のデータを記録。
  9. 以下の処理のパフォーマンスを計った。
    1. forループ内(10,000,000回)で j = j + 1を実行する。
    2. Forループ内(10,000,000回)で文字aの連結を実行する。
    3. 10,000,000個の配列に全て同じ文字列abを代入する。
    4. 1,000,000個のMap(連想配列)すべてに、文字列aとiを文字にキャストしたものをキーにして、iを文字にキャストしたものと文字列sakaiを連結したものを代入する。
    5. 100,000個の単純なビーンクラス(Person)を作って、それらを全て配列に代入する。
    6. 700,000行のファイルをオープンし、Aliceで始まる行を正規表現でチュエックし、カウントする作業を行う(不思議の国のアリスを70万行文複製したファイルを利用)。
    7. 10,000個のレコードをDBにインサート、その後そのレコード数を取得する。
  10. 計測はtimeコマンドのuserを、ただし、ファイルをオープンするものとDBにアクセスするのはrealも記録。

結果は、次のようです。

色々考察は出来るでしょうが、とりあえず第1印象だけでも。

  1. C++はさすがに速い。ただ、Mapや、クラスのインスタンス生成、また、正規表現などはそれほどでもない。
  2. 全般的には、思ったよりPHPが検討している(これは予想外!)。
  3. Perlはファイルをオープンして、正規表現等の処理は、やはり、得意。
  4. Rubyは、僕のコーディングなどが駄目なことやコンパイルオプション等も考えられるが(rubyはpythonzでインストール)、思ったより遅い。
  5. Node.jsは、パフォーマンスとは無関係な話だけれど、処理をした後に結果を表示する際に、非同期なのでうまくいかなくて、相当苦労した(ふう、勉強しようっと!)。
  6. Node.jsは、もしかしたら、僕のコーディングに問題の可能性はあるが、外部ファイルなどにアクセスするものは遅い一方で、そうでない処理に関しては結構速い。

ソースや結果などはhttp://www.chikkun.com/performance.zipにあります。必要なら、ここからダウンロードして下さい。