LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-19

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回繰り返した結果を出力しました。以下、ソースと実験結果です。

ソース
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) + "日";
        });

    }

}
結果
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に用意されているインターフェースを使用。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1