tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

cctz_benchmark.cc (41198B)


      1 // Copyright 2016 Google Inc. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //   https://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 //   Unless required by applicable law or agreed to in writing, software
     10 //   distributed under the License is distributed on an "AS IS" BASIS,
     11 //   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 //   See the License for the specific language governing permissions and
     13 //   limitations under the License.
     14 
     15 #include <algorithm>
     16 #include <cassert>
     17 #include <chrono>
     18 #include <ctime>
     19 #include <random>
     20 #include <string>
     21 #include <vector>
     22 
     23 #include "benchmark/benchmark.h"
     24 #include "absl/time/internal/cctz/include/cctz/civil_time.h"
     25 #include "absl/time/internal/cctz/include/cctz/time_zone.h"
     26 #include "absl/time/internal/cctz/src/time_zone_impl.h"
     27 
     28 namespace {
     29 
     30 namespace cctz = absl::time_internal::cctz;
     31 
     32 void BM_Difference_Days(benchmark::State& state) {
     33  const cctz::civil_day c(2014, 8, 22);
     34  const cctz::civil_day epoch(1970, 1, 1);
     35  while (state.KeepRunning()) {
     36    benchmark::DoNotOptimize(c - epoch);
     37  }
     38 }
     39 BENCHMARK(BM_Difference_Days);
     40 
     41 void BM_Step_Days(benchmark::State& state) {
     42  const cctz::civil_day kStart(2014, 8, 22);
     43  cctz::civil_day c = kStart;
     44  while (state.KeepRunning()) {
     45    benchmark::DoNotOptimize(++c);
     46  }
     47 }
     48 BENCHMARK(BM_Step_Days);
     49 
     50 void BM_GetWeekday(benchmark::State& state) {
     51  const cctz::civil_day c(2014, 8, 22);
     52  while (state.KeepRunning()) {
     53    benchmark::DoNotOptimize(cctz::get_weekday(c));
     54  }
     55 }
     56 BENCHMARK(BM_GetWeekday);
     57 
     58 void BM_NextWeekday(benchmark::State& state) {
     59  const cctz::civil_day kStart(2014, 8, 22);
     60  const cctz::civil_day kDays[7] = {
     61      kStart + 0, kStart + 1, kStart + 2, kStart + 3,
     62      kStart + 4, kStart + 5, kStart + 6,
     63  };
     64  const cctz::weekday kWeekdays[7] = {
     65      cctz::weekday::monday,   cctz::weekday::tuesday, cctz::weekday::wednesday,
     66      cctz::weekday::thursday, cctz::weekday::friday,  cctz::weekday::saturday,
     67      cctz::weekday::sunday,
     68  };
     69  while (state.KeepRunningBatch(7 * 7)) {
     70    for (const auto from : kDays) {
     71      for (const auto to : kWeekdays) {
     72        benchmark::DoNotOptimize(cctz::next_weekday(from, to));
     73      }
     74    }
     75  }
     76 }
     77 BENCHMARK(BM_NextWeekday);
     78 
     79 void BM_PrevWeekday(benchmark::State& state) {
     80  const cctz::civil_day kStart(2014, 8, 22);
     81  const cctz::civil_day kDays[7] = {
     82      kStart + 0, kStart + 1, kStart + 2, kStart + 3,
     83      kStart + 4, kStart + 5, kStart + 6,
     84  };
     85  const cctz::weekday kWeekdays[7] = {
     86      cctz::weekday::monday,   cctz::weekday::tuesday, cctz::weekday::wednesday,
     87      cctz::weekday::thursday, cctz::weekday::friday,  cctz::weekday::saturday,
     88      cctz::weekday::sunday,
     89  };
     90  while (state.KeepRunningBatch(7 * 7)) {
     91    for (const auto from : kDays) {
     92      for (const auto to : kWeekdays) {
     93        benchmark::DoNotOptimize(cctz::prev_weekday(from, to));
     94      }
     95    }
     96  }
     97 }
     98 BENCHMARK(BM_PrevWeekday);
     99 
    100 const char RFC3339_full[] = "%Y-%m-%d%ET%H:%M:%E*S%Ez";
    101 const char RFC3339_sec[] = "%Y-%m-%d%ET%H:%M:%S%Ez";
    102 
    103 const char RFC1123_full[] = "%a, %d %b %Y %H:%M:%S %z";
    104 const char RFC1123_no_wday[] = "%d %b %Y %H:%M:%S %z";
    105 
    106 // A list of known time-zone names.
    107 // TODO: Refactor with src/time_zone_lookup_test.cc.
    108 const char* const kTimeZoneNames[] = {"Africa/Abidjan",
    109                                      "Africa/Accra",
    110                                      "Africa/Addis_Ababa",
    111                                      "Africa/Algiers",
    112                                      "Africa/Asmara",
    113                                      "Africa/Bamako",
    114                                      "Africa/Bangui",
    115                                      "Africa/Banjul",
    116                                      "Africa/Bissau",
    117                                      "Africa/Blantyre",
    118                                      "Africa/Brazzaville",
    119                                      "Africa/Bujumbura",
    120                                      "Africa/Cairo",
    121                                      "Africa/Casablanca",
    122                                      "Africa/Ceuta",
    123                                      "Africa/Conakry",
    124                                      "Africa/Dakar",
    125                                      "Africa/Dar_es_Salaam",
    126                                      "Africa/Djibouti",
    127                                      "Africa/Douala",
    128                                      "Africa/El_Aaiun",
    129                                      "Africa/Freetown",
    130                                      "Africa/Gaborone",
    131                                      "Africa/Harare",
    132                                      "Africa/Johannesburg",
    133                                      "Africa/Juba",
    134                                      "Africa/Kampala",
    135                                      "Africa/Khartoum",
    136                                      "Africa/Kigali",
    137                                      "Africa/Kinshasa",
    138                                      "Africa/Lagos",
    139                                      "Africa/Libreville",
    140                                      "Africa/Lome",
    141                                      "Africa/Luanda",
    142                                      "Africa/Lubumbashi",
    143                                      "Africa/Lusaka",
    144                                      "Africa/Malabo",
    145                                      "Africa/Maputo",
    146                                      "Africa/Maseru",
    147                                      "Africa/Mbabane",
    148                                      "Africa/Mogadishu",
    149                                      "Africa/Monrovia",
    150                                      "Africa/Nairobi",
    151                                      "Africa/Ndjamena",
    152                                      "Africa/Niamey",
    153                                      "Africa/Nouakchott",
    154                                      "Africa/Ouagadougou",
    155                                      "Africa/Porto-Novo",
    156                                      "Africa/Sao_Tome",
    157                                      "Africa/Timbuktu",
    158                                      "Africa/Tripoli",
    159                                      "Africa/Tunis",
    160                                      "Africa/Windhoek",
    161                                      "America/Adak",
    162                                      "America/Anchorage",
    163                                      "America/Anguilla",
    164                                      "America/Antigua",
    165                                      "America/Araguaina",
    166                                      "America/Argentina/Buenos_Aires",
    167                                      "America/Argentina/Catamarca",
    168                                      "America/Argentina/Cordoba",
    169                                      "America/Argentina/Jujuy",
    170                                      "America/Argentina/La_Rioja",
    171                                      "America/Argentina/Mendoza",
    172                                      "America/Argentina/Rio_Gallegos",
    173                                      "America/Argentina/Salta",
    174                                      "America/Argentina/San_Juan",
    175                                      "America/Argentina/San_Luis",
    176                                      "America/Argentina/Tucuman",
    177                                      "America/Argentina/Ushuaia",
    178                                      "America/Aruba",
    179                                      "America/Asuncion",
    180                                      "America/Atikokan",
    181                                      "America/Atka",
    182                                      "America/Bahia",
    183                                      "America/Bahia_Banderas",
    184                                      "America/Barbados",
    185                                      "America/Belem",
    186                                      "America/Belize",
    187                                      "America/Blanc-Sablon",
    188                                      "America/Boa_Vista",
    189                                      "America/Bogota",
    190                                      "America/Boise",
    191                                      "America/Cambridge_Bay",
    192                                      "America/Campo_Grande",
    193                                      "America/Cancun",
    194                                      "America/Caracas",
    195                                      "America/Cayenne",
    196                                      "America/Cayman",
    197                                      "America/Chicago",
    198                                      "America/Chihuahua",
    199                                      "America/Ciudad_Juarez",
    200                                      "America/Coral_Harbour",
    201                                      "America/Costa_Rica",
    202                                      "America/Creston",
    203                                      "America/Cuiaba",
    204                                      "America/Curacao",
    205                                      "America/Danmarkshavn",
    206                                      "America/Dawson",
    207                                      "America/Dawson_Creek",
    208                                      "America/Denver",
    209                                      "America/Detroit",
    210                                      "America/Dominica",
    211                                      "America/Edmonton",
    212                                      "America/Eirunepe",
    213                                      "America/El_Salvador",
    214                                      "America/Ensenada",
    215                                      "America/Fort_Nelson",
    216                                      "America/Fortaleza",
    217                                      "America/Glace_Bay",
    218                                      "America/Godthab",
    219                                      "America/Goose_Bay",
    220                                      "America/Grand_Turk",
    221                                      "America/Grenada",
    222                                      "America/Guadeloupe",
    223                                      "America/Guatemala",
    224                                      "America/Guayaquil",
    225                                      "America/Guyana",
    226                                      "America/Halifax",
    227                                      "America/Havana",
    228                                      "America/Hermosillo",
    229                                      "America/Indiana/Indianapolis",
    230                                      "America/Indiana/Knox",
    231                                      "America/Indiana/Marengo",
    232                                      "America/Indiana/Petersburg",
    233                                      "America/Indiana/Tell_City",
    234                                      "America/Indiana/Vevay",
    235                                      "America/Indiana/Vincennes",
    236                                      "America/Indiana/Winamac",
    237                                      "America/Inuvik",
    238                                      "America/Iqaluit",
    239                                      "America/Jamaica",
    240                                      "America/Juneau",
    241                                      "America/Kentucky/Louisville",
    242                                      "America/Kentucky/Monticello",
    243                                      "America/Kralendijk",
    244                                      "America/La_Paz",
    245                                      "America/Lima",
    246                                      "America/Los_Angeles",
    247                                      "America/Lower_Princes",
    248                                      "America/Maceio",
    249                                      "America/Managua",
    250                                      "America/Manaus",
    251                                      "America/Marigot",
    252                                      "America/Martinique",
    253                                      "America/Matamoros",
    254                                      "America/Mazatlan",
    255                                      "America/Menominee",
    256                                      "America/Merida",
    257                                      "America/Metlakatla",
    258                                      "America/Mexico_City",
    259                                      "America/Miquelon",
    260                                      "America/Moncton",
    261                                      "America/Monterrey",
    262                                      "America/Montevideo",
    263                                      "America/Montreal",
    264                                      "America/Montserrat",
    265                                      "America/Nassau",
    266                                      "America/New_York",
    267                                      "America/Nipigon",
    268                                      "America/Nome",
    269                                      "America/Noronha",
    270                                      "America/North_Dakota/Beulah",
    271                                      "America/North_Dakota/Center",
    272                                      "America/North_Dakota/New_Salem",
    273                                      "America/Nuuk",
    274                                      "America/Ojinaga",
    275                                      "America/Panama",
    276                                      "America/Pangnirtung",
    277                                      "America/Paramaribo",
    278                                      "America/Phoenix",
    279                                      "America/Port-au-Prince",
    280                                      "America/Port_of_Spain",
    281                                      "America/Porto_Acre",
    282                                      "America/Porto_Velho",
    283                                      "America/Puerto_Rico",
    284                                      "America/Punta_Arenas",
    285                                      "America/Rainy_River",
    286                                      "America/Rankin_Inlet",
    287                                      "America/Recife",
    288                                      "America/Regina",
    289                                      "America/Resolute",
    290                                      "America/Rio_Branco",
    291                                      "America/Santa_Isabel",
    292                                      "America/Santarem",
    293                                      "America/Santiago",
    294                                      "America/Santo_Domingo",
    295                                      "America/Sao_Paulo",
    296                                      "America/Scoresbysund",
    297                                      "America/Shiprock",
    298                                      "America/Sitka",
    299                                      "America/St_Barthelemy",
    300                                      "America/St_Johns",
    301                                      "America/St_Kitts",
    302                                      "America/St_Lucia",
    303                                      "America/St_Thomas",
    304                                      "America/St_Vincent",
    305                                      "America/Swift_Current",
    306                                      "America/Tegucigalpa",
    307                                      "America/Thule",
    308                                      "America/Thunder_Bay",
    309                                      "America/Tijuana",
    310                                      "America/Toronto",
    311                                      "America/Tortola",
    312                                      "America/Vancouver",
    313                                      "America/Virgin",
    314                                      "America/Whitehorse",
    315                                      "America/Winnipeg",
    316                                      "America/Yakutat",
    317                                      "America/Yellowknife",
    318                                      "Antarctica/Casey",
    319                                      "Antarctica/Davis",
    320                                      "Antarctica/DumontDUrville",
    321                                      "Antarctica/Macquarie",
    322                                      "Antarctica/Mawson",
    323                                      "Antarctica/McMurdo",
    324                                      "Antarctica/Palmer",
    325                                      "Antarctica/Rothera",
    326                                      "Antarctica/Syowa",
    327                                      "Antarctica/Troll",
    328                                      "Antarctica/Vostok",
    329                                      "Arctic/Longyearbyen",
    330                                      "Asia/Aden",
    331                                      "Asia/Almaty",
    332                                      "Asia/Amman",
    333                                      "Asia/Anadyr",
    334                                      "Asia/Aqtau",
    335                                      "Asia/Aqtobe",
    336                                      "Asia/Ashgabat",
    337                                      "Asia/Atyrau",
    338                                      "Asia/Baghdad",
    339                                      "Asia/Bahrain",
    340                                      "Asia/Baku",
    341                                      "Asia/Bangkok",
    342                                      "Asia/Barnaul",
    343                                      "Asia/Beirut",
    344                                      "Asia/Bishkek",
    345                                      "Asia/Brunei",
    346                                      "Asia/Chita",
    347                                      "Asia/Choibalsan",
    348                                      "Asia/Chongqing",
    349                                      "Asia/Colombo",
    350                                      "Asia/Damascus",
    351                                      "Asia/Dhaka",
    352                                      "Asia/Dili",
    353                                      "Asia/Dubai",
    354                                      "Asia/Dushanbe",
    355                                      "Asia/Famagusta",
    356                                      "Asia/Gaza",
    357                                      "Asia/Harbin",
    358                                      "Asia/Hebron",
    359                                      "Asia/Ho_Chi_Minh",
    360                                      "Asia/Hong_Kong",
    361                                      "Asia/Hovd",
    362                                      "Asia/Irkutsk",
    363                                      "Asia/Istanbul",
    364                                      "Asia/Jakarta",
    365                                      "Asia/Jayapura",
    366                                      "Asia/Jerusalem",
    367                                      "Asia/Kabul",
    368                                      "Asia/Kamchatka",
    369                                      "Asia/Karachi",
    370                                      "Asia/Kashgar",
    371                                      "Asia/Kathmandu",
    372                                      "Asia/Khandyga",
    373                                      "Asia/Kolkata",
    374                                      "Asia/Krasnoyarsk",
    375                                      "Asia/Kuala_Lumpur",
    376                                      "Asia/Kuching",
    377                                      "Asia/Kuwait",
    378                                      "Asia/Macau",
    379                                      "Asia/Magadan",
    380                                      "Asia/Makassar",
    381                                      "Asia/Manila",
    382                                      "Asia/Muscat",
    383                                      "Asia/Nicosia",
    384                                      "Asia/Novokuznetsk",
    385                                      "Asia/Novosibirsk",
    386                                      "Asia/Omsk",
    387                                      "Asia/Oral",
    388                                      "Asia/Phnom_Penh",
    389                                      "Asia/Pontianak",
    390                                      "Asia/Pyongyang",
    391                                      "Asia/Qatar",
    392                                      "Asia/Qostanay",
    393                                      "Asia/Qyzylorda",
    394                                      "Asia/Riyadh",
    395                                      "Asia/Sakhalin",
    396                                      "Asia/Samarkand",
    397                                      "Asia/Seoul",
    398                                      "Asia/Shanghai",
    399                                      "Asia/Singapore",
    400                                      "Asia/Srednekolymsk",
    401                                      "Asia/Taipei",
    402                                      "Asia/Tashkent",
    403                                      "Asia/Tbilisi",
    404                                      "Asia/Tehran",
    405                                      "Asia/Tel_Aviv",
    406                                      "Asia/Thimphu",
    407                                      "Asia/Tokyo",
    408                                      "Asia/Tomsk",
    409                                      "Asia/Ulaanbaatar",
    410                                      "Asia/Urumqi",
    411                                      "Asia/Ust-Nera",
    412                                      "Asia/Vientiane",
    413                                      "Asia/Vladivostok",
    414                                      "Asia/Yakutsk",
    415                                      "Asia/Yangon",
    416                                      "Asia/Yekaterinburg",
    417                                      "Asia/Yerevan",
    418                                      "Atlantic/Azores",
    419                                      "Atlantic/Bermuda",
    420                                      "Atlantic/Canary",
    421                                      "Atlantic/Cape_Verde",
    422                                      "Atlantic/Faroe",
    423                                      "Atlantic/Jan_Mayen",
    424                                      "Atlantic/Madeira",
    425                                      "Atlantic/Reykjavik",
    426                                      "Atlantic/South_Georgia",
    427                                      "Atlantic/St_Helena",
    428                                      "Atlantic/Stanley",
    429                                      "Australia/Adelaide",
    430                                      "Australia/Brisbane",
    431                                      "Australia/Broken_Hill",
    432                                      "Australia/Canberra",
    433                                      "Australia/Currie",
    434                                      "Australia/Darwin",
    435                                      "Australia/Eucla",
    436                                      "Australia/Hobart",
    437                                      "Australia/Lindeman",
    438                                      "Australia/Lord_Howe",
    439                                      "Australia/Melbourne",
    440                                      "Australia/Perth",
    441                                      "Australia/Sydney",
    442                                      "Australia/Yancowinna",
    443                                      "Etc/GMT",
    444                                      "Etc/GMT+0",
    445                                      "Etc/GMT+1",
    446                                      "Etc/GMT+10",
    447                                      "Etc/GMT+11",
    448                                      "Etc/GMT+12",
    449                                      "Etc/GMT+2",
    450                                      "Etc/GMT+3",
    451                                      "Etc/GMT+4",
    452                                      "Etc/GMT+5",
    453                                      "Etc/GMT+6",
    454                                      "Etc/GMT+7",
    455                                      "Etc/GMT+8",
    456                                      "Etc/GMT+9",
    457                                      "Etc/GMT-0",
    458                                      "Etc/GMT-1",
    459                                      "Etc/GMT-10",
    460                                      "Etc/GMT-11",
    461                                      "Etc/GMT-12",
    462                                      "Etc/GMT-13",
    463                                      "Etc/GMT-14",
    464                                      "Etc/GMT-2",
    465                                      "Etc/GMT-3",
    466                                      "Etc/GMT-4",
    467                                      "Etc/GMT-5",
    468                                      "Etc/GMT-6",
    469                                      "Etc/GMT-7",
    470                                      "Etc/GMT-8",
    471                                      "Etc/GMT-9",
    472                                      "Etc/GMT0",
    473                                      "Etc/Greenwich",
    474                                      "Etc/UCT",
    475                                      "Etc/UTC",
    476                                      "Etc/Universal",
    477                                      "Etc/Zulu",
    478                                      "Europe/Amsterdam",
    479                                      "Europe/Andorra",
    480                                      "Europe/Astrakhan",
    481                                      "Europe/Athens",
    482                                      "Europe/Belfast",
    483                                      "Europe/Belgrade",
    484                                      "Europe/Berlin",
    485                                      "Europe/Bratislava",
    486                                      "Europe/Brussels",
    487                                      "Europe/Bucharest",
    488                                      "Europe/Budapest",
    489                                      "Europe/Busingen",
    490                                      "Europe/Chisinau",
    491                                      "Europe/Copenhagen",
    492                                      "Europe/Dublin",
    493                                      "Europe/Gibraltar",
    494                                      "Europe/Guernsey",
    495                                      "Europe/Helsinki",
    496                                      "Europe/Isle_of_Man",
    497                                      "Europe/Istanbul",
    498                                      "Europe/Jersey",
    499                                      "Europe/Kaliningrad",
    500                                      "Europe/Kirov",
    501                                      "Europe/Kyiv",
    502                                      "Europe/Lisbon",
    503                                      "Europe/Ljubljana",
    504                                      "Europe/London",
    505                                      "Europe/Luxembourg",
    506                                      "Europe/Madrid",
    507                                      "Europe/Malta",
    508                                      "Europe/Mariehamn",
    509                                      "Europe/Minsk",
    510                                      "Europe/Monaco",
    511                                      "Europe/Moscow",
    512                                      "Europe/Nicosia",
    513                                      "Europe/Oslo",
    514                                      "Europe/Paris",
    515                                      "Europe/Podgorica",
    516                                      "Europe/Prague",
    517                                      "Europe/Riga",
    518                                      "Europe/Rome",
    519                                      "Europe/Samara",
    520                                      "Europe/San_Marino",
    521                                      "Europe/Sarajevo",
    522                                      "Europe/Saratov",
    523                                      "Europe/Simferopol",
    524                                      "Europe/Skopje",
    525                                      "Europe/Sofia",
    526                                      "Europe/Stockholm",
    527                                      "Europe/Tallinn",
    528                                      "Europe/Tirane",
    529                                      "Europe/Tiraspol",
    530                                      "Europe/Ulyanovsk",
    531                                      "Europe/Vaduz",
    532                                      "Europe/Vatican",
    533                                      "Europe/Vienna",
    534                                      "Europe/Vilnius",
    535                                      "Europe/Volgograd",
    536                                      "Europe/Warsaw",
    537                                      "Europe/Zagreb",
    538                                      "Europe/Zurich",
    539                                      "Factory",
    540                                      "Indian/Antananarivo",
    541                                      "Indian/Chagos",
    542                                      "Indian/Christmas",
    543                                      "Indian/Cocos",
    544                                      "Indian/Comoro",
    545                                      "Indian/Kerguelen",
    546                                      "Indian/Mahe",
    547                                      "Indian/Maldives",
    548                                      "Indian/Mauritius",
    549                                      "Indian/Mayotte",
    550                                      "Indian/Reunion",
    551                                      "Pacific/Apia",
    552                                      "Pacific/Auckland",
    553                                      "Pacific/Bougainville",
    554                                      "Pacific/Chatham",
    555                                      "Pacific/Chuuk",
    556                                      "Pacific/Easter",
    557                                      "Pacific/Efate",
    558                                      "Pacific/Fakaofo",
    559                                      "Pacific/Fiji",
    560                                      "Pacific/Funafuti",
    561                                      "Pacific/Galapagos",
    562                                      "Pacific/Gambier",
    563                                      "Pacific/Guadalcanal",
    564                                      "Pacific/Guam",
    565                                      "Pacific/Honolulu",
    566                                      "Pacific/Johnston",
    567                                      "Pacific/Kanton",
    568                                      "Pacific/Kiritimati",
    569                                      "Pacific/Kosrae",
    570                                      "Pacific/Kwajalein",
    571                                      "Pacific/Majuro",
    572                                      "Pacific/Marquesas",
    573                                      "Pacific/Midway",
    574                                      "Pacific/Nauru",
    575                                      "Pacific/Niue",
    576                                      "Pacific/Norfolk",
    577                                      "Pacific/Noumea",
    578                                      "Pacific/Pago_Pago",
    579                                      "Pacific/Palau",
    580                                      "Pacific/Pitcairn",
    581                                      "Pacific/Pohnpei",
    582                                      "Pacific/Port_Moresby",
    583                                      "Pacific/Rarotonga",
    584                                      "Pacific/Saipan",
    585                                      "Pacific/Samoa",
    586                                      "Pacific/Tahiti",
    587                                      "Pacific/Tarawa",
    588                                      "Pacific/Tongatapu",
    589                                      "Pacific/Wake",
    590                                      "Pacific/Wallis",
    591                                      "Pacific/Yap",
    592                                      "UTC",
    593                                      nullptr};
    594 
    595 std::vector<std::string> AllTimeZoneNames() {
    596  std::vector<std::string> names;
    597  for (const char* const* namep = kTimeZoneNames; *namep != nullptr; ++namep) {
    598    names.push_back(std::string("file:") + *namep);
    599  }
    600  assert(!names.empty());
    601 
    602  std::mt19937 urbg(42);  // a UniformRandomBitGenerator with fixed seed
    603  std::shuffle(names.begin(), names.end(), urbg);
    604  return names;
    605 }
    606 
    607 cctz::time_zone TestTimeZone() {
    608  cctz::time_zone tz;
    609  cctz::load_time_zone("America/Los_Angeles", &tz);
    610  return tz;
    611 }
    612 
    613 void BM_Zone_LoadUTCTimeZoneFirst(benchmark::State& state) {
    614  cctz::time_zone tz;
    615  cctz::load_time_zone("UTC", &tz);  // in case we're first
    616  cctz::time_zone::Impl::ClearTimeZoneMapTestOnly();
    617  while (state.KeepRunning()) {
    618    benchmark::DoNotOptimize(cctz::load_time_zone("UTC", &tz));
    619  }
    620 }
    621 BENCHMARK(BM_Zone_LoadUTCTimeZoneFirst);
    622 
    623 void BM_Zone_LoadUTCTimeZoneLast(benchmark::State& state) {
    624  cctz::time_zone tz;
    625  for (const auto& name : AllTimeZoneNames()) {
    626    cctz::load_time_zone(name, &tz);  // prime cache
    627  }
    628  while (state.KeepRunning()) {
    629    benchmark::DoNotOptimize(cctz::load_time_zone("UTC", &tz));
    630  }
    631 }
    632 BENCHMARK(BM_Zone_LoadUTCTimeZoneLast);
    633 
    634 void BM_Zone_LoadTimeZoneFirst(benchmark::State& state) {
    635  cctz::time_zone tz = cctz::utc_time_zone();  // in case we're first
    636  const std::string name = "file:America/Los_Angeles";
    637  while (state.KeepRunning()) {
    638    state.PauseTiming();
    639    cctz::time_zone::Impl::ClearTimeZoneMapTestOnly();
    640    state.ResumeTiming();
    641    benchmark::DoNotOptimize(cctz::load_time_zone(name, &tz));
    642  }
    643 }
    644 BENCHMARK(BM_Zone_LoadTimeZoneFirst);
    645 
    646 void BM_Zone_LoadTimeZoneCached(benchmark::State& state) {
    647  cctz::time_zone tz = cctz::utc_time_zone();  // in case we're first
    648  cctz::time_zone::Impl::ClearTimeZoneMapTestOnly();
    649  const std::string name = "file:America/Los_Angeles";
    650  cctz::load_time_zone(name, &tz);  // prime cache
    651  while (state.KeepRunning()) {
    652    benchmark::DoNotOptimize(cctz::load_time_zone(name, &tz));
    653  }
    654 }
    655 BENCHMARK(BM_Zone_LoadTimeZoneCached);
    656 
    657 void BM_Zone_LoadLocalTimeZoneCached(benchmark::State& state) {
    658  cctz::utc_time_zone();  // in case we're first
    659  cctz::time_zone::Impl::ClearTimeZoneMapTestOnly();
    660  cctz::local_time_zone();  // prime cache
    661  while (state.KeepRunning()) {
    662    benchmark::DoNotOptimize(cctz::local_time_zone());
    663  }
    664 }
    665 BENCHMARK(BM_Zone_LoadLocalTimeZoneCached);
    666 
    667 void BM_Zone_LoadAllTimeZonesFirst(benchmark::State& state) {
    668  cctz::time_zone tz;
    669  const std::vector<std::string> names = AllTimeZoneNames();
    670  for (auto index = names.size(); state.KeepRunning(); ++index) {
    671    if (index == names.size()) {
    672      index = 0;
    673    }
    674    if (index == 0) {
    675      state.PauseTiming();
    676      cctz::time_zone::Impl::ClearTimeZoneMapTestOnly();
    677      state.ResumeTiming();
    678    }
    679    benchmark::DoNotOptimize(cctz::load_time_zone(names[index], &tz));
    680  }
    681 }
    682 BENCHMARK(BM_Zone_LoadAllTimeZonesFirst);
    683 
    684 void BM_Zone_LoadAllTimeZonesCached(benchmark::State& state) {
    685  cctz::time_zone tz;
    686  const std::vector<std::string> names = AllTimeZoneNames();
    687  for (const auto& name : names) {
    688    cctz::load_time_zone(name, &tz);  // prime cache
    689  }
    690  for (auto index = names.size(); state.KeepRunning(); ++index) {
    691    if (index == names.size()) {
    692      index = 0;
    693    }
    694    benchmark::DoNotOptimize(cctz::load_time_zone(names[index], &tz));
    695  }
    696 }
    697 BENCHMARK(BM_Zone_LoadAllTimeZonesCached);
    698 
    699 void BM_Zone_TimeZoneEqualityImplicit(benchmark::State& state) {
    700  cctz::time_zone tz;  // implicit UTC
    701  while (state.KeepRunning()) {
    702    benchmark::DoNotOptimize(tz == tz);
    703  }
    704 }
    705 BENCHMARK(BM_Zone_TimeZoneEqualityImplicit);
    706 
    707 void BM_Zone_TimeZoneEqualityExplicit(benchmark::State& state) {
    708  cctz::time_zone tz = cctz::utc_time_zone();  // explicit UTC
    709  while (state.KeepRunning()) {
    710    benchmark::DoNotOptimize(tz == tz);
    711  }
    712 }
    713 BENCHMARK(BM_Zone_TimeZoneEqualityExplicit);
    714 
    715 void BM_Zone_UTCTimeZone(benchmark::State& state) {
    716  cctz::time_zone tz;
    717  while (state.KeepRunning()) {
    718    benchmark::DoNotOptimize(cctz::utc_time_zone());
    719  }
    720 }
    721 BENCHMARK(BM_Zone_UTCTimeZone);
    722 
    723 // In each "ToCivil" benchmark we switch between two instants separated
    724 // by at least one transition in order to defeat any internal caching of
    725 // previous results (e.g., see local_time_hint_).
    726 //
    727 // The "UTC" variants use UTC instead of the Google/local time zone.
    728 
    729 void BM_Time_ToCivil_CCTZ(benchmark::State& state) {
    730  const cctz::time_zone tz = TestTimeZone();
    731  std::chrono::system_clock::time_point tp =
    732      std::chrono::system_clock::from_time_t(1384569027);
    733  std::chrono::system_clock::time_point tp2 =
    734      std::chrono::system_clock::from_time_t(1418962578);
    735  while (state.KeepRunning()) {
    736    std::swap(tp, tp2);
    737    tp += std::chrono::seconds(1);
    738    benchmark::DoNotOptimize(cctz::convert(tp, tz));
    739  }
    740 }
    741 BENCHMARK(BM_Time_ToCivil_CCTZ);
    742 
    743 void BM_Time_ToCivil_Libc(benchmark::State& state) {
    744  // No timezone support, so just use localtime.
    745  time_t t = 1384569027;
    746  time_t t2 = 1418962578;
    747  struct tm tm;
    748  while (state.KeepRunning()) {
    749    std::swap(t, t2);
    750    t += 1;
    751 #if defined(_WIN32) || defined(_WIN64)
    752    benchmark::DoNotOptimize(localtime_s(&tm, &t));
    753 #else
    754    benchmark::DoNotOptimize(localtime_r(&t, &tm));
    755 #endif
    756  }
    757 }
    758 BENCHMARK(BM_Time_ToCivil_Libc);
    759 
    760 void BM_Time_ToCivilUTC_CCTZ(benchmark::State& state) {
    761  const cctz::time_zone tz = cctz::utc_time_zone();
    762  std::chrono::system_clock::time_point tp =
    763      std::chrono::system_clock::from_time_t(1384569027);
    764  while (state.KeepRunning()) {
    765    tp += std::chrono::seconds(1);
    766    benchmark::DoNotOptimize(cctz::convert(tp, tz));
    767  }
    768 }
    769 BENCHMARK(BM_Time_ToCivilUTC_CCTZ);
    770 
    771 void BM_Time_ToCivilUTC_Libc(benchmark::State& state) {
    772  time_t t = 1384569027;
    773  struct tm tm;
    774  while (state.KeepRunning()) {
    775    t += 1;
    776 #if defined(_WIN32) || defined(_WIN64)
    777    benchmark::DoNotOptimize(gmtime_s(&tm, &t));
    778 #else
    779    benchmark::DoNotOptimize(gmtime_r(&t, &tm));
    780 #endif
    781  }
    782 }
    783 BENCHMARK(BM_Time_ToCivilUTC_Libc);
    784 
    785 // In each "FromCivil" benchmark we switch between two YMDhms values
    786 // separated by at least one transition in order to defeat any internal
    787 // caching of previous results (e.g., see time_local_hint_).
    788 //
    789 // The "UTC" variants use UTC instead of the Google/local time zone.
    790 // The "Day0" variants require normalization of the day of month.
    791 
    792 void BM_Time_FromCivil_CCTZ(benchmark::State& state) {
    793  const cctz::time_zone tz = TestTimeZone();
    794  int i = 0;
    795  while (state.KeepRunning()) {
    796    if ((i++ & 1) == 0) {
    797      benchmark::DoNotOptimize(
    798          cctz::convert(cctz::civil_second(2014, 12, 18, 20, 16, 18), tz));
    799    } else {
    800      benchmark::DoNotOptimize(
    801          cctz::convert(cctz::civil_second(2013, 11, 15, 18, 30, 27), tz));
    802    }
    803  }
    804 }
    805 BENCHMARK(BM_Time_FromCivil_CCTZ);
    806 
    807 void BM_Time_FromCivil_Libc(benchmark::State& state) {
    808  // No timezone support, so just use localtime.
    809  int i = 0;
    810  while (state.KeepRunning()) {
    811    struct tm tm;
    812    if ((i++ & 1) == 0) {
    813      tm.tm_year = 2014 - 1900;
    814      tm.tm_mon = 12 - 1;
    815      tm.tm_mday = 18;
    816      tm.tm_hour = 20;
    817      tm.tm_min = 16;
    818      tm.tm_sec = 18;
    819    } else {
    820      tm.tm_year = 2013 - 1900;
    821      tm.tm_mon = 11 - 1;
    822      tm.tm_mday = 15;
    823      tm.tm_hour = 18;
    824      tm.tm_min = 30;
    825      tm.tm_sec = 27;
    826    }
    827    tm.tm_isdst = -1;
    828    benchmark::DoNotOptimize(mktime(&tm));
    829  }
    830 }
    831 BENCHMARK(BM_Time_FromCivil_Libc);
    832 
    833 void BM_Time_FromCivilUTC_CCTZ(benchmark::State& state) {
    834  const cctz::time_zone tz = cctz::utc_time_zone();
    835  while (state.KeepRunning()) {
    836    benchmark::DoNotOptimize(
    837        cctz::convert(cctz::civil_second(2014, 12, 18, 20, 16, 18), tz));
    838  }
    839 }
    840 BENCHMARK(BM_Time_FromCivilUTC_CCTZ);
    841 
    842 // There is no BM_Time_FromCivilUTC_Libc.
    843 
    844 void BM_Time_FromCivilDay0_CCTZ(benchmark::State& state) {
    845  const cctz::time_zone tz = TestTimeZone();
    846  int i = 0;
    847  while (state.KeepRunning()) {
    848    if ((i++ & 1) == 0) {
    849      benchmark::DoNotOptimize(
    850          cctz::convert(cctz::civil_second(2014, 12, 0, 20, 16, 18), tz));
    851    } else {
    852      benchmark::DoNotOptimize(
    853          cctz::convert(cctz::civil_second(2013, 11, 0, 18, 30, 27), tz));
    854    }
    855  }
    856 }
    857 BENCHMARK(BM_Time_FromCivilDay0_CCTZ);
    858 
    859 void BM_Time_FromCivilDay0_Libc(benchmark::State& state) {
    860  // No timezone support, so just use localtime.
    861  int i = 0;
    862  while (state.KeepRunning()) {
    863    struct tm tm;
    864    if ((i++ & 1) == 0) {
    865      tm.tm_year = 2014 - 1900;
    866      tm.tm_mon = 12 - 1;
    867      tm.tm_mday = 0;
    868      tm.tm_hour = 20;
    869      tm.tm_min = 16;
    870      tm.tm_sec = 18;
    871    } else {
    872      tm.tm_year = 2013 - 1900;
    873      tm.tm_mon = 11 - 1;
    874      tm.tm_mday = 0;
    875      tm.tm_hour = 18;
    876      tm.tm_min = 30;
    877      tm.tm_sec = 27;
    878    }
    879    tm.tm_isdst = -1;
    880    benchmark::DoNotOptimize(mktime(&tm));
    881  }
    882 }
    883 BENCHMARK(BM_Time_FromCivilDay0_Libc);
    884 
    885 const char* const kFormats[] = {
    886    RFC1123_full,           // 0
    887    RFC1123_no_wday,        // 1
    888    RFC3339_full,           // 2
    889    RFC3339_sec,            // 3
    890    "%Y-%m-%d%ET%H:%M:%S",  // 4
    891    "%Y-%m-%d",             // 5
    892 };
    893 const int kNumFormats = sizeof(kFormats) / sizeof(kFormats[0]);
    894 
    895 void BM_Format_FormatTime(benchmark::State& state) {
    896  const std::string fmt = kFormats[state.range(0)];
    897  state.SetLabel(fmt);
    898  const cctz::time_zone tz = TestTimeZone();
    899  const std::chrono::system_clock::time_point tp =
    900      cctz::convert(cctz::civil_second(1977, 6, 28, 9, 8, 7), tz) +
    901      std::chrono::microseconds(1);
    902  while (state.KeepRunning()) {
    903    benchmark::DoNotOptimize(cctz::format(fmt, tp, tz));
    904  }
    905 }
    906 BENCHMARK(BM_Format_FormatTime)->DenseRange(0, kNumFormats - 1);
    907 
    908 void BM_Format_ParseTime(benchmark::State& state) {
    909  const std::string fmt = kFormats[state.range(0)];
    910  state.SetLabel(fmt);
    911  const cctz::time_zone tz = TestTimeZone();
    912  std::chrono::system_clock::time_point tp =
    913      cctz::convert(cctz::civil_second(1977, 6, 28, 9, 8, 7), tz) +
    914      std::chrono::microseconds(1);
    915  const std::string when = cctz::format(fmt, tp, tz);
    916  while (state.KeepRunning()) {
    917    benchmark::DoNotOptimize(cctz::parse(fmt, when, tz, &tp));
    918  }
    919 }
    920 BENCHMARK(BM_Format_ParseTime)->DenseRange(0, kNumFormats - 1);
    921 
    922 }  // namespace