俺の言語がこんなに遅いわけがない!? 〜C, Java, PHP, Python, Rubyによるプログラミング言語 速度比較〜

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。最近、複数の言語にまたがった処理が必要なプログラムを書くハメになっている西山です。

いろいろなプログラミング言語を触っているとそれぞれの言語の特性が気になってきます。世の中にはたくさんのプログラミング言語があり、それぞれ特徴を持っていて、いろいろな長所短所があることでしょう。

ひとつ、プログラミング言語の特徴を比較する上で、それらの言語で書かれたプログラムの実行速度というものはわかりやすい指標になるのではないでしょうか。

 

今回、わたしが思いつくままに選んだ『5つのプログラミング言語で同じ内容の処理を実行しその実行速度を比較する』という実験を行ってみたので、この記事にてご紹介しようと思います。

 

実験内容

対象言語

まず対象プログラミング言語として

  • C
  • Java
  • PHP
  • Python
  • Ruby

を選びました。書きやすかったので。

 

 

実行する処理

実行する共通の処理として、これもけっこう適当ですが、

1からnまでの自然数の和を求める関数を作り、
n を 1 から N まで増やしながら、その関数を呼び出し、
結果を配列に格納する

というものを使うことにします。今回は N = 10000 としました。

 

 

使われる機能

この処理で主に使われるプログラミング言語の機能として、

  • 関数呼び出し(O(N)回)
  • 自然数の和の計算(O(N^2)回)
  • ループ処理 (O(N^2)回)
  • 配列へのアクセス (O(N)回)

あたりが挙げられるでしょうか。(カッコ内はプログラムを通しての計算回数のオーダーです。)

 

 

予想してみる

処理速度はどのような順になると予想しますか?

やはりコンパイラ型言語である C と Java はインタープリター型の PHP, Python, Ruby とは別格の速さを出してくれるでしょうね。特にネイティブのマシン語にコンパイルされる C は JVM 上で動くバイトコードにコンパイルされる Java よりも速いのではないでしょうか。

インタープリター型の方の順はなんとも予測しづらいのですが、Ruby は普通の整数型とかも全てオブジェクトだと言うし、今回大きなオーダーを占める和の計算あたりが遅そうだな、という印象。Python と PHP はよく分からないですがいままで少し触った経験から Python のほうが速いのかなーって感じ。

 

 

というわけで、わたしは実験前に、

 

C > Java >>>> Python ≧ PHP > Ruby

 

という順を予想しました。

 

 

各言語の紹介と実装コード

以下では対象のプログラミング言語での実装コードとを載せる共に、
それぞれの言語について簡単な紹介をします。

短いコードですが、各言語がもつ雰囲気を感じ取っていただければうれしいです。

 

 

C 言語

 c

C 言語は1970年代に OS である Unix を記述するために作られた言語です。そのため、ハードウェアに近い低レベルでの記述ができます。

システムのメモリーを直接操作することのできる“ポインタ”はC 言語のこの特徴を最もよく表した機能の一つでしょう。

 

今回扱う言語はどれもこの C 言語の影響を多分に受けており、プログラミング言語界のおじいちゃん的存在です。

通常の処理系では C 言語は各実行環境のネイティブの機械語にコンパイルされて実行されます。CPU が直接コードを実行するため処理速度としては最高のパフォーマンスが期待できそうです。

 

 

Java

java

Java は1990年代にサン・マイクロシステムズ社により開発されたコンパイラ型の言語です。

 

オブジェクト指向と呼ばれるプログラミング技法をサポートしていて、クラスやその継承などという概念により、開発効率や保守性を高めています。

通常は Java Virtual Machine (JVM) と呼ばれる仮想マシン上で動く中間言語(バイトコード)にコンパイルされます。

 

Windows, Linux, モバイル機器など様々な環境にそれぞれ JVM が用意されていて、それらは共通のバイトコードを実行可能とされています。この特徴は “Write once, run anywhere” と言い表わされ、Java プログラムの移植性の高さを示しています。

 

実行環境が仮想マシンであることから速度面では C 言語には劣ると思われていますが・・・。

 

 

PHP

php

みんな大好き PHP!

 

1990年代後半に発表され、Web の発達とともに広まったスクリプト言語です。Web アプリケーションのサーバーサイドで動作し、HTML埋込み型の構文を利用できます。

ここはけっこう大事だと思うのですよね。Python や Ruby と違って、PHP はそれ自体がテンプレートエンジンなんです。

 

PHP5 からは本格的なオブジェクト指向プログラミングをサポートし、大規模な web 開発にも対応できるようになっています。弱い動的型付けが採用されているのが長所でもあり短所でもあるでしょうか。

とりあえず連想配列に何でも入れておけー、とやってしまうと配列地獄に陥る危険があります。通常は Zend Engine というスクリプトエンジンで動作します。速度面ではスクリプト言語らしい速度、といった感じなのかなー。

 

なお Facebook のシステムは PHP で書かれているものの、Zend Engine は使っておらず、HipHop VM という独自の高速な実行環境で動いているらしいです。

 

 

Python

python

Pythonは1990年代前半から開発されているオブジェクト指向スクリプト言語です。文法が必要最小限に抑えられており、プログラマーの学習の負担が軽減されています。海外では非常に人気の高い言語とのことですが、日本での普及はイマイチの印象を受けます。

 

Dropbox は Python で実装されているそうです。また、Google で使われている主要スクリプト言語とされています。

 

コードの見た目の特徴として、処理の区切りがインデントで表されている、ということがあります。インデントを強制されるので、見た目がきれいになりやすいです。

本家 CPython に加えて、JVM で動くJython, .NET で動く IronPython などいろいろな処理系があるのも特徴的ですね。

 

 

Ruby

ruby

Rubyは1990年代半ばからまつもとゆきひろ氏によって開発されている日本生まれのオブジェクト指向スクリプト言語です。

 

整数や文字列なども含め、すべてのデータ型がオブジェクトである、純粋なオブジェクト指向を特徴としています。

Python に似た言語という印象を受けますが、日本では Ruby のほうが人気でしょうか。

 

Ruby の Web アプリケーションフレームワークである Ruby on Rails (2004-) の登場により、世界的にも人気が出てきています。CakePHP はこの Ruby on Rails から強く影響を受けて作られたそうです。

公式の処理系として、もともとまつもと氏によって作られた実装(MRI, Matz’ Ruby Implementation)がありましたが、1.9 系からは笹田耕一氏による YARV (Yet Another Ruby VM)という VM が採用されています。

YARV により、Ruby の処理速度は大きく改善したと言われています。

 

 

実行環境

マシンおよび OS

今回は実行環境としてアマゾン・ウェブサービス(AWS)の t1.micro インスタンスにAmazon Linux を入れたものを用意しました。

 

 

言語ごとの処理系情報

各言語の処理系情報は以下のとおりです。

 

C 言語

gcc version 4.6.3 20120306 (Red Hat 4.6.3-2) (GCC)
gcc -o test_c test.c
でコンパイルし、
time ./test_c
で実行しました。

 

Java

java version “1.6.0_30”
OpenJDK Runtime Environment (IcedTea6 1.13.1) (amazon-66.1.13.1.62.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
javac test.java
でコンパイルし、
time java test
で実行しました。

 

PHP

PHP 5.5.7 (cli) (built: Feb 3 2014 21:14:40)
time php test.php
で実行しました。

Python

CPython 2.6.9
time python test.py
で実行しました。

 

Ruby

ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
time ruby test.rb
で実行しました。

 

 

 

実験結果発表!

実験結果

各言語で書いたプログラムの実行時間を time コマンドで測定し、結果をグラフにしました。単位はミリ秒です。

 

順位は処理の早い順に、

 

Java > C >>>> PHP > Python >> Ruby

 

といった感じになりました。

 

 

考察的なものとか。

やっぱりコンパイラは速い!

やはりコンパイラ言語である C, Java は PHP, Python, Ruby より圧倒的に速いですね。みんな大好き PHP を基準とした場合、 C は 13.5 倍、Java は 19.1 倍速いという結果です。

 

驚くべきは、Java のほうが Cより速いということ。これは当初の予想と違っています。

どうも Java をコンパイルするときにコンパイラによるコードの最適化が利いているのと、JITコンパイル技術によりコア部分がネイティブコードにコンパイルされて実行されてるのかな・・・?

そこで、C 言語も gcc に最適化オプションをつけて、
gcc -O -o test_c test.c
のようにコンパイルしてみると、58ミリ秒という結果が出ました。

 

これで Java より速くなったので、どうやら Java はデフォルトで最適化 + JITが有効のようです。このあたりのことはまた機会を改めて調べてみたいと思います。

 

 

スクリプト言語の順位は・・・?

スクリプト言語たちについては今回の結果では『PHP > Python > Ruby』という結果になりました。みんな大好き PHP を基準とした場合、 Python は 1.5 倍遅く、Ruby は 4 倍以上遅いという結果です。

今回の Ruby は 1.8.7 なのでまだ YARV が入っていないのでしょうか、予想以上に悪い結果になりました。

 

AWS ではなく手元の MacBook pro + Ruby 2.0 で走らせると、『Ruby ≧ Python >> PHP』 (なんで俺のPHPがこんなに遅いわけ?)のような結果になるので、環境に依存する部分がかなり大きいのかもしれません。

この辺りもまた別の機会に詳しく調べる必要がありそうです。

 

 

 

終わりに

今回はいろいろなプログラミング言語について、処理速度に注目して調べてみました。
速いは正義!というのが真理ならばじゃあもう全部 C でいいんじゃないかな、となってしまいそうですが、世の中はそうなっていません。

処理が遅くても手軽、書きやすい、保守しやすい、などの理由からさまざまな言語が広く使われているのですね。

 

速さももちろん大事ですが、各プログラミング言語の特性を理解し、用途にあった選択をするのが大切なんだと思います。

 

 

予定よりものすごい長文になってしまいましたが、今回はここまで。

お読みくださりありがとうございました。

 

プログラミング20言語習得法 [ 小林健一郎 ]

価格:1,058円
(2015/7/31 11:08時点)

  • このエントリーをはてなブックマークに追加
  • Pocket

SNSでもご購読できます。

コメント

コメントを残す

*