yyyy年MM月dd日の出力速さ比較

yyyy年MM月dd日の出力の速さについて、以下の方法を比較しました。

+ 使うクラスは以下の2つです。
    + Calendar
    + LocalDateTime (java8)
+ それぞれで以下の3つの方法を使いました。
    + CalendarではSimpleDateFormat、LocalDateTimeではDateTimeFormatterを使用。
    + String.formatを使用。
    + 年、月、日それぞれを文字列連結。

実行環境は以下の通りです。

+ DELL VOSTRO 1540
+ Windows 10 Pro 32bit
+ Intel Celelron 2.00 GHZ
+ メモリ 2.0GB
+ HDは約300GB

#ソースと実行結果

上記の方法を30000回繰り返した結果を出力しました。以下、ソースと実験結果です。

```java:ソース
package test;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.function.Supplier;

public class Test {

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

    // --計測--
    private static final String format = "%04d年%02d年%02d日";
    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy年MM月dd日");
    private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyy年MM月dd日");

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

    private void test() {

        Calendar calendar = Calendar.getInstance();
        // 日付設定
        calendar.set(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 9);

        LocalDateTime localDateTime = LocalDateTime.of(
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH) + 1,
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR),
                calendar.get(Calendar.MINUTE));

        // 実行

        System.out.printf("%-35s", "Calendar + SimpleDateFormat");
        printProcessingTime(() -> {
            return SDF.format(calendar.getTime());
        });

        System.out.printf("%-35s", "Calendar + String.format");
        printProcessingTime(() -> {
            return String.format(format,
                    calendar.get(Calendar.YEAR),
                    (calendar.get(Calendar.MONTH) + 1),
                    calendar.get(Calendar.DAY_OF_MONTH));
        });

        System.out.printf("%-30s", "Calendar + 文字列連結");
        printProcessingTime(() -> {
            int m = calendar.get(Calendar.MONTH) + 1;
            int d = calendar.get(Calendar.DAY_OF_MONTH);
            return calendar.get(Calendar.YEAR) + "年"
                    + (m < 10 ? "0" + m : m) + "月"
                    + (d < 10 ? "0" + d : d) + "日";
        });

        System.out.printf("%-35s", "LocalDateTime + DateTimeFormatter");
        printProcessingTime(() -> {
            return DTF.format(localDateTime);
        });

        System.out.printf("%-35s", "LocalDateTime + String.format");
        printProcessingTime(() -> {
            return  String.format(format,
                    localDateTime.getYear(),
                    localDateTime.getMonthValue(),
                    localDateTime.getDayOfMonth());
        });

        System.out.printf("%-30s", "LocalDateTime + 文字列連結");
        printProcessingTime(() -> {
            int m = localDateTime.getMonthValue();
            int d = localDateTime.getDayOfMonth();
            return  localDateTime.getYear() + "年"
                        + (m < 10 ? "0" + m : m) + "月"
                        + (d < 10 ? "0" + d : d) + "日";
        });

    }

}
```

```DOS:結果
Calendar + SimpleDateFormat        出力確認:2016年01月09日, 計測 157: 
Calendar + String.format           出力確認:2016年01年09日, 計測 306: 
Calendar + 文字列連結              出力確認:2016年01月09日, 計測  21: 
LocalDateTime + DateTimeFormatter  出力確認:2016年01月09日, 計測  29: 
LocalDateTime + String.format      出力確認:2016年01年09日, 計測 238: 
LocalDateTime + 文字列連結         出力確認:2016年01月09日, 計測  17: 
```

LocalDateTimeで文字列連結するのが一番速いという結果になりました。

#修正履歴

+ ソースを修正し、java.util.functionに用意されているインターフェースを使用。