java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

LocalDateTimeで年月日を出力

投稿日:

最終更新日:2016年09月26日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

Date-Time-APIにLocalDateクラスがあります。このクラスを使って、年月日をいくつかのやり方で出力して、速さを測定してみました。

Date-Time-APIには日付を表すクラスLocalDateが用意されています。このクラスを使い、年月日を出力することを考えます。今回は次の3つの方法を使い、処理の速さを比較しました。

  • DateTimeFormatter.formatメソッドを使う。
  • String.formatメソッドを使う。
  • 年、月、日を取得し、文字列連結する。

上記の3つのメソッドをそれぞれ一定の回数実行することを行い、かかった時間を出力することにします。

HelloFormatという名前でクラスを作りました。

計測用インターフェース

計測用のインターフェースとメソッドを以下のように定義しました。

HelloFormatクラス前半

    interface MyFunction {
        abstract String criate();
    }

    private void printProcessingTime(MyFunction myFunction) {
        int count = 30000;
        long start, end;
        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            myFunction.criate();
        }
        end = System.currentTimeMillis();
        System.out.printf("出力確認:%s, 計測 %3d", myFunction.criate(), end - start);
        System.out.println();
    }

MyFunctionインターフェースはcriate()メソッドのみを持ちます。このメソッドは年月日を返却するように実装することを想定しています。このメソッドの実行時間を計るためのメソッドが次に定義しているprintProcessingTimeメソッドです。

printProcessingTimeメソッドは引数にMyFunctionインターフェースを指定します。MyFunctionインターフェースがひとつのメソッドのみを持つため、実効をラムダ式で記述することができます。

計測処理

実際の計測をする部分はクラス後半で定義しています。

HelloFormatクラス後半

    private static final String FORMAT = "%d年%d年%d日";
    private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("y年M月d日");

    public static void main(String[] args) {
        new HelloFormat().test();
    }

    private void test() {

        // 日付設定
        LocalDate localDate = LocalDate.of(2001, 10, 21);

        // 実行
        System.out.printf("%-20s", "DateTimeFormatter");
        printProcessingTime(() -> {
            return DTF.format(localDate);
        });

        System.out.printf("%-20s", "String.format");
        printProcessingTime(() -> {
            return  String.format(FORMAT,
                    localDate.getYear(),
                    localDate.getMonthValue(),
                    localDate.getDayOfMonth());
        });

        System.out.printf("%-15s", "文字列連結");
        printProcessingTime(() -> {
            return  localDate.getYear() + "年"
                        + localDate.getMonthValue() + "月"
                        + localDate.getDayOfMonth() + "日";
        });

    }

定数を2つ定義しています。変数String FORMATはString#format()メソッドの第一引数に指定するために定義しています。DateTimeFormatter DTFはDateTimeFormatter#format()メソッドを呼び出すために定義しています。

test()メソッドで実際に計測を実施しています。最初にLocalDateクラスのインスタンスを生成しています。2001年10月21日を表すインスタンスを生成して、変数にlocalDateに格納しています。順番にprintProcessingTimeメソッドを呼び出しています。このとき、引数に記述したラムダ式が実際に測定される処理です。

実際の結果の一例が以下です。計測時間は毎回少し変わります。

結果

DateTimeFormatter   出力確認:2001年10月21日, 計測  37
String.format       出力確認:2001年10年21日, 計測 221
文字列連結          出力確認:2001年10月21日, 計測  12

文字列連結する場合が一番速いという結果が出ました。