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が最速
ネイティブスレッドではなくユーザスレッドなので、マルチコアにしても十分性能を発揮できないと思われる点も、サーバ台数増やすしかソリューションがないのか?とますますやるせない。
結局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が最速
トラックバック



linesが出てない
ちなみにListへの詰め替えを行わないでst.nextToken()だけだと、大体5000msちょうどくらいになる。それでもPythonより遅いかー。うーん。