過去に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.449Sun製の1.4.2_18でintern()メソッドを呼ぶ場合のパフォーマンスの悪さが特に際立つ。12分ですよ。