1e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer/*
2e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * Copyright (C) 2016 The Android Open Source Project
3e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer *
4e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * Licensed under the Apache License, Version 2.0 (the "License");
5e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * you may not use this file except in compliance with the License.
6e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * You may obtain a copy of the License at
7e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer *
8e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer *      http://www.apache.org/licenses/LICENSE-2.0
9e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer *
10e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * Unless required by applicable law or agreed to in writing, software
11e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * distributed under the License is distributed on an "AS IS" BASIS,
12e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * See the License for the specific language governing permissions and
14e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * limitations under the License.
15e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer */
16e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerpackage benchmarks.regression;
17e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
18e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport android.icu.text.TimeZoneNames;
19e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
20e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport java.text.DateFormatSymbols;
21e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport java.text.ParseException;
22e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport java.text.SimpleDateFormat;
23e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport java.util.Arrays;
24e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport java.util.Date;
25e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport java.util.Locale;
26e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerimport java.util.TimeZone;
27e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
28e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer/**
29e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * Benchmark for java.text.SimpleDateFormat. This tests common formatting, parsing and creation
30e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer * operations with a specific focus on TimeZone handling.
31e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer */
32e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauerpublic class SimpleDateFormatBenchmark {
33e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_createFormatWithTimeZone(int reps) {
34e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
35e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd z");
36e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
37e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
38e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
39e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_parseWithTimeZoneShort(int reps) throws ParseException {
40e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd z");
41e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
42e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            sdf.parse("2000.01.01 PST");
43e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
44e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
45e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
46e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_parseWithTimeZoneLong(int reps) throws ParseException {
47e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd zzzz");
48e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
49e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            sdf.parse("2000.01.01 Pacific Standard Time");
50e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
51e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
52e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
53e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_parseWithoutTimeZone(int reps) throws ParseException {
54e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
55e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
56e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            sdf.parse("2000.01.01");
57e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
58e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
59e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
60e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_createAndParseWithTimeZoneShort(int reps) throws ParseException {
61e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
62e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd z");
63e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            sdf.parse("2000.01.01 PST");
64e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
65e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
66e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
67e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_createAndParseWithTimeZoneLong(int reps) throws ParseException {
68e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
69e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd zzzz");
70e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            sdf.parse("2000.01.01 Pacific Standard Time");
71e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
72e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
73e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
74e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_formatWithTimeZoneShort(int reps) {
75e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd z");
76e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
77e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            sdf.format(new Date());
78e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
79e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
80e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
81e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public void time_formatWithTimeZoneLong(int reps) {
82e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd zzzz");
83e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        for (int i = 0; i < reps; i++) {
84e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer            sdf.format(new Date());
85e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        }
86e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
87e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
88e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    /**
89e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer     * Times first-time execution to measure effects of initial loading of data that's lost in
90e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer     * full caliper benchmarks.
91e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer     */
92e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    public static void main(String[] args) throws ParseException {
93e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        long start, end;
94e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
95e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        Locale locale = Locale.GERMAN;
96e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        start = System.nanoTime();
97e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd zzzz", locale);
98e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        end = System.nanoTime();
99e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        System.out.printf("Creating first SDF: %,d ns\n", end-start);
100e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
101e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        // N code had special cases for currently-set and for default timezone. We want to measure
102e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        // the generic case.
103e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        sdf.setTimeZone(TimeZone.getTimeZone("Hongkong"));
104e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
105e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        start = System.nanoTime();
106e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        sdf.parse("2000.1.1 Kubanische Normalzeit");
107e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        end = System.nanoTime();
108e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        System.out.printf("First parse: %,d ns\n", end-start);
109e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer
110e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        start = System.nanoTime();
111e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        sdf.format(new Date());
112e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        end = System.nanoTime();
113e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer        System.out.printf("First format: %,d ns\n", end-start);
114e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer    }
115e73e05f5c111cc8b33497cf67d18a075cee267b5Joachim Sauer}
116