String#intern()メソッドのパフォーマンス
過去にStringクラスのintern()メソッドに関することを書いた。
で、計測屋(何)としては実行時間も計らねば(謎)。
まず、計測用のコード。
import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.HashMap; import java.util.Map; public class Main { private static NumberFormat nf = new DecimalFormat( "000000000000000000000000000000000000000000000000000000000000"); /** * @param args */ public static void main(String[] args) { test(args.length > 0 && Boolean.valueOf(args[0]).booleanValue()); } private static void test(boolean intern) { System.out.println("=== test(" + intern + ") ==="); long start = System.currentTimeMillis(); Map map = new HashMap(1000000); try { for (int i = 0; i < 1000000; ++i) { String s = nf.format(i); if (intern) { s = s.intern(); } map.put(s, s); } } finally { long end = System.currentTimeMillis(); System.out.println("time: " + ((end - start) / 1000.0)); } } }
これにパラメータとして"true"を渡せばintern()メソッドを呼び出し、"false"を渡せばintern()メソッドを呼び出さない。
次のJava VMを計測対象として使用。
- Java 2 SE 1.4.2_18 (Sun製)
- Java 2 SE 5.0 Update 11 (Sun製)
- Java SE 6 Update 1
- Java 2 SE 5.0 (SR1) (IBM製) (DB2 Express-C v9.1.2に付属)
- Java 2 SE 5.0 (SR5) (IBM製) (DB2 Express-C v9.5.2に付属)
- Java SE 6 (SR3) (IBM製) (DB2 Express-C v9.7.0に付属)
各Java VMについて、"true"、"false"各3回ずつ計測してみた。単位は秒。
Java VM intern 1回目 2回目 3回目 平均 Sun 1.4.2_18 true 711.481 711.544 719.058 714.028 false 17.631 17.795 17.763 17.730 Sun 1.5.0_11 true 81.931 82.373 82.008 82.104 false 16.859 16.846 16.848 16.851 Sun 1.6.0_01 true 63.943 64.474 63.925 64.114 false 8.986 8.962 8.955 8.968 IBM 1.5.0 SR1 true 11.066 10.719 11.059 10.948 false 10.846 11.356 12.144 11.449 IBM 1.5.0 SR5 true 11.066 10.719 11.059 10.948 false 10.846 11.356 12.144 11.449 IBM 1.6.0 SR3 true 11.066 10.719 11.059 10.948 false 10.846 11.356 12.144 11.449
Sun製の1.4.2_18でintern()メソッドを呼ぶ場合のパフォーマンスの悪さが特に際立つ。12分ですよ。