DateParseMultiFormat.java

package com.alibaba.fastjson2.benchmark.fastcode;

import com.alibaba.fastjson2.util.DateUtils;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class DateParseMultiFormat {
    static String[] inputs = {
            "2012-06-23 12:13:14",
            "2012-06-23T12:13:14",
            "23/06/2012 12:13:14",
    };
    static final DateTimeFormatter formatter =
            new DateTimeFormatterBuilder()
                    .appendPattern("[yyyy-MM-dd HH:mm:ss]")
                    .appendPattern("[yyyy-MM-dd'T'HH:mm:ss]")
                    .appendPattern("[yyyy/MM/dd HH:mm:ss]")
                    .appendPattern("[dd/MM/yyyy HH:mm:ss]")
                    .appendPattern("[dd MMM yyyy HH:mm:ss]")
                    .toFormatter();

    @Benchmark
    public void javaTimeFormatter(Blackhole bh) throws Throwable {
        Date[] dates = new Date[inputs.length];
        for (int i = 0; i < inputs.length; i++) {
            String input = inputs[i];
            LocalDateTime ldt = LocalDateTime.parse(input, formatter);
            ZoneId zoneId = DateUtils.DEFAULT_ZONE_ID;
            ZonedDateTime zdt = ldt.atZone(zoneId);
            Instant instant = zdt.toInstant();
            dates[i] = Date.from(instant);
        }
        bh.consume(dates);
    }

    @Benchmark
    public void parseDate(Blackhole bh) throws Throwable {
        Date[] dates = new Date[inputs.length];
        for (int i = 0; i < inputs.length; i++) {
            String input = inputs[i];
            dates[i] = DateUtils.parseDate(input);
        }
        bh.consume(dates);
    }

    public static void main(String[] args) throws RunnerException {
        Options options = new OptionsBuilder()
                .include(DateParseMultiFormat.class.getName())
                .mode(Mode.Throughput)
                .timeUnit(TimeUnit.MILLISECONDS)
                .warmupIterations(1)
                .forks(1)
                .build();
        new Runner(options).run();
    }
}