Java 中上級者の

「当たり前」を知らなかった私

@maaya8585

お前だれよ。

@maaya8585

Today's 言いたいこと

検証にも

お作法があるよ!​​​

やりたかった検証

文字列連携処理の速度を調べる

  • str1 + str2

  • concat

  • StringBuffer

  • StringBuilder

検証ダメなExample

public class StrPlus {

    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        usePlus(100000, "a");
        long end = System.currentTimeMillis();

        System.out.println((end - start) + " ms");
    }


    private static void usePlus(int roopCount, String word) {
        String resultStr = "";

        for (int count= 0; count < roopCount; count++) {
            resultStr = resultStr + word;
        }
    }

}

検証ダメなExample

public class StrPlus {

    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        usePlus(100000, "a");
        long end = System.currentTimeMillis();

        System.out.println((end - start) + " ms");
    }


    private static void usePlus(int roopCount, String word) {
        String resultStr = "";

        for (int count= 0; count < roopCount; count++) {
            resultStr = resultStr + word;
        }
    }

}

検証お作法①

ベンチマークには

ウォームアップが必要

検証お作法①

(Javaでは)

JITコンパイラの動作境界線は9000回

1回目〜9000回目の処理と9001回目〜の処理で

処理の動きや速度が変わる

(正確には9000回ぴったりではないです)

検証お作法①

ベンチマークしたい部分

「以外」の処理に

変化があったら

ベンチマークにならないですね

検証お作法①

public class StrPlus {
    public static void main(String[] args) {
        int roopCount = 100000;
        String word = "a";

        usePlus(10000, word);

        long start = System.currentTimeMillis();
        usePlus(roopCount, word);
        long end = System.currentTimeMillis();

        System.out.println((end - start) + " ms");

    }

    private static void usePlus(int roopCount, String word) {
        String resultStr = "";

        for (int count= 0; count < roopCount; count++) {
            resultStr = resultStr + word;
        }
    }
}

実行処理を9000回以上実行

検証お作法②

検証には失敗がある

検証お作法②

どういうときに失敗なの?

失敗ってなに?

検証お作法②

https://goo.gl/ODqi7O

詳しくはwebで。

「お作法とか考えるのつらいよ」

というあなたへ。

 

「その検証まだ正確じゃないよね?もっと正確にやりたいんだけど」

というあなたへ。

JMH

 

ベンチマークツールがあります。

つかってみてね。

「結局検証どうなったんだよ?」

と気になるあなたへ

検証まとめだけ

  • (みなさんの想定どおり) StringBuilder が一番早かったよ

  • Java SE7 のStringBuilderよりJava SE8 のStringBuilderのが早かったよ

  • 他の処理も同様にJava SE 7より Java SE8のが早いよ

  • 一行で文字列連結できる場合は+が一番いいよ

これだけ書かれてもよく分からないと思うので・・・

https://goo.gl/ODqi7O

詳しくはwebで。

Fin.

@maaya8585

20160110_javajo_lt

By maaya ishida

20160110_javajo_lt

  • 1,571