概要
プログラムからディスクやメモリ、ネットワーク上にテキストデータを書き出す際、明示的・暗黙的に文字コードが指定されている。文字コードの種類によって、どのくらい性能差があるのかを測定した。
結論
ASCII 文字列のみの出力の場合、us-ascii, iso-8859-1 での出力が最も高速、UTF-8 もほぼ変わらない性能で出力できる。日本語文字列の場合、UTF-8 が高速。
MS932, EUC-JP はいずれのケースでも、他の文字コードより性能が劣る。とくに EUC-JP はこれらの中で最も遅い。
調査1 - Windows で ASCII 文字列を出力
調査方法
次のプログラムのように、ascii 文字列を繰り返し、ByteArrayOutputStream に書き出し、実行時間を測定する。
public class Test1_2 {
public static void main(String[] args) throws IOException {
String s = "The quick brown fox jumps over the lazy dog";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append(s);
}
Charset charset = Charset.forName("iso-8859-1");
long t = System.currentTimeMillis();
for (int i = 0; i < 20000 * 80; i++) {
doTest(s, charset);
}
long t2 = System.currentTimeMillis();
System.out.println((t2 - t) + " msec");
}
private static void doTest(String s, Charset charset) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(
new ByteArrayOutputStream(), charset);
out.write(s);
out.close();
}
}
実行環境
- PC: DELL Vostro 200
- CPU: Core2Duo E8500 3.16GHz
- OS: Windows XP Pro SP2
- Java 6 update 6
測定結果
us-ascii, iso-8859-1, UTF-8, MS932, EUC-JP の順に高速だった。ASCII 文字列の出力であるにもかかわらず、MS932, EUC-JP での出力は遅い。
なお、文字コードをしていない場合、Windows 環境のデフォルト値 MS932 が使用される。
Windows の場合、明示的に us-ascii や UTF-8 を指定したほうが高速化できる。
| 実行時間[msec] | 文字コード |
|---|---|
| 4374 | us-ascii |
| 4375 | iso-8859-1 |
| 4531 | UTF-8 |
| 5406 | MS932 |
| 6954 | EUC-JP |
調査2 - Windows で 日本語文字列を出力
調査方法
調査1のプログラムにおいて、文字列を日本語に変更し、実行。日本語出力のため、調査文字コードは UTF-8, MS932, EUC-JP とする。
測定結果
UTF-8 が最も高速に実行できた。Java 内部コードと同じ文字コードだけに、余計な手間がかかっていないのだろう。| 実行時間[msec] | 文字コード |
|---|---|
| 4829 | UTF-8 |
| 6359 | MS932 |
| 7500 | EUC-JP |
調査3 - Linux で ASCII 文字列を出力
さきほどのプログラムを Linux 上で実行。実行環境
- PC: IBM Blade HS21 Model G6J
- CPU: Xeon E5450 3GHz
- OS: CentOS 5.2
- kerne: 2.6.18-92.1.6.el5PAE
- glibc: glibc-2.5-24
- Java 6 update 6
測定結果
Widows と同様、us-ascii, iso-8859-1, UTF-8, MS932, EUC-JP の順に高速だった。| 実行時間[msec] | 文字コード |
|---|---|
| 5960 | us-ascii |
| 5974 | iso-8859-1 |
| 5999 | UTF-8 |
| 6378 | MS932 |
| 7503 | EUC-JP |
調査4 - Linux で 日本語文字列を出力
測定結果
Windows と同様の結果となった。| 実行時間[msec] | 文字コード |
|---|---|
| 6093 | UTF-8 |
| 6620 | MS932 |
| 7503 | EUC-JP |
コメントする