1*0cd794d4SMark de Wever //===----------------------------------------------------------------------===// 2*0cd794d4SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 3*0cd794d4SMark de Wever // See https://llvm.org/LICENSE.txt for license information. 4*0cd794d4SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 5*0cd794d4SMark de Wever // 6*0cd794d4SMark de Wever //===----------------------------------------------------------------------===// 7*0cd794d4SMark de Wever 8*0cd794d4SMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17 9*0cd794d4SMark de Wever // UNSUPPORTED: no-filesystem, no-localization, no-tzdb 10*0cd794d4SMark de Wever 11*0cd794d4SMark de Wever // XFAIL: libcpp-has-no-experimental-tzdb 12*0cd794d4SMark de Wever // XFAIL: availability-tzdb-missing 13*0cd794d4SMark de Wever 14*0cd794d4SMark de Wever #include <chrono> 15*0cd794d4SMark de Wever 16*0cd794d4SMark de Wever #include "benchmark/benchmark.h" 17*0cd794d4SMark de Wever 18*0cd794d4SMark de Wever // Benchmarks the performance of the UTC <-> system time conversions. These 19*0cd794d4SMark de Wever // operations determine the sum of leap second insertions at a specific time. 20*0cd794d4SMark de Wever 21*0cd794d4SMark de Wever static void BM_from_sys(benchmark::State& state) { 22*0cd794d4SMark de Wever std::chrono::sys_days date{std::chrono::July / 1 / state.range(0)}; 23*0cd794d4SMark de Wever for (auto _ : state) 24*0cd794d4SMark de Wever benchmark::DoNotOptimize(std::chrono::utc_clock::from_sys(date)); 25*0cd794d4SMark de Wever } 26*0cd794d4SMark de Wever 27*0cd794d4SMark de Wever BENCHMARK(BM_from_sys) 28*0cd794d4SMark de Wever ->Arg(1970) // before the first leap seconds 29*0cd794d4SMark de Wever ->Arg(1979) // in the first half of inserted leap seconds 30*0cd794d4SMark de Wever ->Arg(1993) // in the second half of inserted leap seconds 31*0cd794d4SMark de Wever ->Arg(2100); // after the last leap second 32*0cd794d4SMark de Wever 33*0cd794d4SMark de Wever BENCHMARK(BM_from_sys)->Arg(1970)->Arg(1979)->Arg(1993)->Arg(2100)->Threads(4); 34*0cd794d4SMark de Wever BENCHMARK(BM_from_sys)->Arg(1970)->Arg(1979)->Arg(1993)->Arg(2100)->Threads(16); 35*0cd794d4SMark de Wever 36*0cd794d4SMark de Wever static void BM_to_sys(benchmark::State& state) { 37*0cd794d4SMark de Wever // 59 sec offset means we pass th UTC offset for the leap second; assuming 38*0cd794d4SMark de Wever // there won't be more than 59 leap seconds ever. 39*0cd794d4SMark de Wever std::chrono::utc_seconds date{ 40*0cd794d4SMark de Wever std::chrono::sys_days{std::chrono::July / 1 / state.range(0)}.time_since_epoch() + std::chrono::seconds{59}}; 41*0cd794d4SMark de Wever for (auto _ : state) 42*0cd794d4SMark de Wever benchmark::DoNotOptimize(std::chrono::utc_clock::to_sys(date)); 43*0cd794d4SMark de Wever } 44*0cd794d4SMark de Wever 45*0cd794d4SMark de Wever BENCHMARK(BM_to_sys) 46*0cd794d4SMark de Wever ->Arg(1970) // before the first leap seconds 47*0cd794d4SMark de Wever ->Arg(1979) // in the first half of inserted leap seconds 48*0cd794d4SMark de Wever ->Arg(1993) // in the second half of inserted leap seconds 49*0cd794d4SMark de Wever ->Arg(2100); // after the last leap second 50*0cd794d4SMark de Wever 51*0cd794d4SMark de Wever BENCHMARK(BM_to_sys)->Arg(1970)->Arg(1979)->Arg(1993)->Arg(2100)->Threads(4); 52*0cd794d4SMark de Wever BENCHMARK(BM_to_sys)->Arg(1970)->Arg(1979)->Arg(1993)->Arg(2100)->Threads(16); 53*0cd794d4SMark de Wever 54*0cd794d4SMark de Wever int main(int argc, char** argv) { 55*0cd794d4SMark de Wever benchmark::Initialize(&argc, argv); 56*0cd794d4SMark de Wever if (benchmark::ReportUnrecognizedArguments(argc, argv)) 57*0cd794d4SMark de Wever return 1; 58*0cd794d4SMark de Wever 59*0cd794d4SMark de Wever benchmark::RunSpecifiedBenchmarks(); 60*0cd794d4SMark de Wever } 61