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