読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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分ですよ。