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