雨谷の日和

過去20年で2,700を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

JavaとCの実行比較

2004.02.23付で書いた「Javaの性能」について、ご意見の表明があった。
こんなところなんて誰も読んでないだろうとたかをくくっていたので、正直嬉しい。
以下、そのご意見の私なりの要約である。(詳細な主張は、リンク先を参照頂きたい)

へこり日記言いがかりはいけないと思う」より要約

  • 実行時のエラーチェック
    • Javaは実行時のエラーチェックを厳密に行っている
    • Cは実行時のエラーチェックを行っていない
      →エラーチェックの分、Javaの実行速度は遅い
  • VM(バーチャルマシン)
    • JavaにはVMがある
    • CにはVMに相当する部分が無い
      →JavaVMが動いている分、Javaの実行速度は遅い
  • 最適化
    • Javaコンパイル時の最適化が不可能であり、実行時にのみ最適化を行う
    • Cはコンパイル時にかなりの最適化が可能である
      →最適化が不十分なので、Javaの実行速度は遅い
      →実行時の最適化の処理の分、Javaの実行速度は遅い
  • 理由は不明だが、言語仕様上、Javaの実行速度は遅い(らしい)

ここで屁理屈太郎氏が挙げている論点は、Javaの実行速度が遅いと主張する人の典型的なものだと私は思う。
これらについては、おいおい一つ一つ私見を書くつもりでいる。
しかしとりあえずは、現実を見てみよう。理屈はそれからでも良いだろう。
似たようなコードをCとJavaで作成し、その実行速度を比較してみる。

/* Cのソース */
#include 
int main(void) {
  int i;
  FILE *out;
  out = fopen("c_log.txt", "w");
  for(i = 0; i < 10000000; ++i)fprintf(out, "Hello world!\n");
  fclose(out);
  return (0);
}
/* Javaのソース */

import java.io.PrintWriter;
import java.io.FileWriter;
class Test {
  public static void main(String[] args) throws Exception {
    PrintWriter out = new PrintWriter(new FileWriter("j_log.txt"));
    for(int i = 0; i < 10000000; ++i)out.print("Hello world!\n");
    out.close();
  }
}

上記二つをコンパイルし、以下のようにして実行した。(Cのものが先、Javaのが後)

# 実行用スクリプト

#! /bin/sh

date '+%H:%M:%S'
test.exe
date '+%H:%M:%S'
java Test
date '+%H:%M:%S'

で、こちらが結果である。

Pentium4:2.4GHz WindowsXP + cygwin + jdk1.4 + gcc

19:08:50
19:09:06
19:09:14

Cのものは処理に約16秒、Javaのものは約8秒かかっている。
つまり、少なくともこの場合、Javaの方が速い。