Trasis Inc.

渋谷拠点のシステム開発会社

文字列出力エンコードの性能差比較

概要

プログラムからディスクやメモリ、ネットワーク上にテキストデータを書き出す際、明示的・暗黙的に文字コードが指定されている。
文字コードの種類によって、どのくらい性能差があるのかを測定した。

結論

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