マイクロベンチマークのわな

罠をひらがなで書くと「レフカンディのわな」みたいでかっこよく見える!不思議!


http://d.hatena.ne.jp/r_ikeda/20090529/threadlocal
一見まともそうな結果に見えるが…。

うちのマシンでの結果

run:
[LocalFormat] 2297
[StaticFormat] 2219
[SyncFormat] 1219
[ThreadLocalFormat] 969
構築成功 (合計時間: 6 秒)

なんか変に見えるだろうか。

ためしにmainを以下のように2回実行するように書き換えてみる。

    public static void main(String[] args) {
        testLocalFormat();
        testStaticFormat();
        testSyncFormat();
        testThreadLocalFormat();
        
        testLocalFormat();
        testStaticFormat();
        testSyncFormat();
        testThreadLocalFormat();
    }

結果

run:
[LocalFormat] 2250
[StaticFormat] 2266
[SyncFormat] 1265
[ThreadLocalFormat] 969
[LocalFormat] 953
[StaticFormat] 969
[SyncFormat] 1016
[ThreadLocalFormat] 968
構築成功 (合計時間: 10 秒)

Hotspotの最適化が途中ではいってますなぁ。

DateFormatは生成コストが高く、そもそもマルチスレッドのベンチではないので、新しいJavaのバージョンほど同期のコストが低いので期待した結果になってない可能性が高い。

マルチスレッドつかってLockクラス使ったりすると面白いかも。Lockはほんと便利なんだぜ…。