上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
コミュニティ検索 »
Java | 2006/11/22(水) 03:15
Rubyやってるとやっぱり速度に不安が残ります。
ネイティブスレッドではなくユーザスレッドなので、マルチコアにしても十分性能を発揮できないと思われる点も、サーバ台数増やすしかソリューションがないのか?とますますやるせない。
結局Mongrelを複数立ち上げて、Rubyプロセス自体多くなったらマルチコアの性能発揮できるかも、とか。やってみようと思ってます。結果は後日。

で、前にもリンクした各言語でCSVパース速度を比較したこのブログ記事ですが、Javaでもやってみました。
せっかくなのでソースと結果を残しておきます。


環境は、以下。
IBM ThinkPad T43
CPU: Pentium M(centrino) 1.6GHz
メモリ: 1GB
HDD: 40GB(5400rpm / 9.5mm) ←たぶん
OS: Windows XP pro

JDK1.5.0.8
Eclipse3.2.1上で実行。

データは元記事と同様に、郵便番号データを3倍したものを使用。
まずはソースから。
う、読みづらい・・・でもいい感じにできなかったんです。


package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

public class CSV {

    public static void main(String[] args) {
        long totalTime = 0;
        int times = 10;
        for (int i = 0; i < times; i++) {
            totalTime += read("KEN_ALL3.csv");
        }

        System.out.println("=================================");
        System.out.println("Average Time = " + totalTime / times + "ms");
    }

    public static long read(String filename) {
        System.out.println("---------------------------------");
        System.out.println("start at " + new Date());
        long start = System.currentTimeMillis();
        int lines = 0;
        try {
            File csv = new File(filename);
            BufferedReader br = new BufferedReader(new FileReader(csv));

            while (br.ready()) {
                lines++;
                String line = br.readLine();
                StringTokenizer st = new StringTokenizer(line, ",");

                // とりあえずListへの詰め替えだけやってみる
                List<String> list = new ArrayList<String>();
                while (st.hasMoreTokens()) {
                    list.add(st.nextToken());
                }
            }
            br.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("lines = " + lines);
        System.out.println("end at " + new Date());
        long elapsedTime = System.currentTimeMillis() - start;
        System.out.println("elapsed time = " + elapsedTime + "ms");
        return elapsedTime;
    }
}



で、結果。
10回の平均を取ってみた。意外にもPythonより遅い。


---------------------------------
start at Wed Nov 22 02:29:27 JST 2006
lines =
end at Wed Nov 22 02:29:31 JST 2006
elapsed time = 4000ms
---------------------------------
start at Wed Nov 22 02:29:31 JST 2006
lines =
end at Wed Nov 22 02:29:35 JST 2006
elapsed time = 4203ms
---------------------------------
start at Wed Nov 22 02:29:35 JST 2006
lines =
end at Wed Nov 22 02:29:43 JST 2006
elapsed time = 7516ms
---------------------------------
start at Wed Nov 22 02:29:43 JST 2006
lines =
end at Wed Nov 22 02:29:50 JST 2006
elapsed time = 7609ms
---------------------------------
start at Wed Nov 22 02:29:50 JST 2006
lines =
end at Wed Nov 22 02:29:55 JST 2006
elapsed time = 4125ms
---------------------------------
start at Wed Nov 22 02:29:55 JST 2006
lines =
end at Wed Nov 22 02:29:58 JST 2006
elapsed time = 3813ms
---------------------------------
start at Wed Nov 22 02:29:58 JST 2006
lines =
end at Wed Nov 22 02:30:07 JST 2006
elapsed time = 8312ms
---------------------------------
start at Wed Nov 22 02:30:07 JST 2006
lines =
end at Wed Nov 22 02:30:15 JST 2006
elapsed time = 8250ms
---------------------------------
start at Wed Nov 22 02:30:15 JST 2006
lines =
end at Wed Nov 22 02:30:23 JST 2006
elapsed time = 8063ms
---------------------------------
start at Wed Nov 22 02:30:23 JST 2006
lines =
end at Wed Nov 22 02:30:27 JST 2006
elapsed time = 3640ms
=================================
Average Time = 5953ms


何回やってもこのくらいだから、偶然ではないみたい。
実はJavaがぶっちぎりで速い結果が出そうとか思ってました。

そもそもRubyやPythonのCSVパース処理が何やってるかわからないので、公平な比較ではないかも。でもこの実装はかなり手抜きなのに、Pythonより遅いというのはちょっとショック。でもやっぱりRubyやPerlよりは十分早いか。


結論: CSVパースはPythonが最速

スポンサーサイト
コメント (2) | トラックバック (0)
コミュニティ検索 » Java Ruby
トラックバック
この記事のトラックバックURL
http://completemirage.blog55.fc2.com/tb.php/33-9c033032
この記事にトラックバックする(FC2ブログユーザー)
コメント

linesが出てない

あれ、linesが出ない。まあ常に365355なので関係ないけど。
ちなみにListへの詰め替えを行わないでst.nextToken()だけだと、大体5000msちょうどくらいになる。それでもPythonより遅いかー。うーん。
2006/11/22(水) 03:29 Miyazima URL [編集]

Pythonが速いのは、速度の必要な箇所がCかC++で実装されているからなんだと思います。
2008/07/04(金) 16:32 everes URL [編集]







非公開コメント
プロフィール
 

miyazima

Author:miyazima
常に変化を好み、面白いことを探しています。次の次は?

カレンダー
 
01 | 2017/02 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -
カウンター
 
天気予報
 

-天気予報コム- -FC2-
ブログ内検索
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。