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