brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.8 KiB · 3e76b62 Raw
215 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// Don't warn about std::sprintf12// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated13 14#include <array>15#include <concepts>16#include <cstdio>17#include <deque>18#include <format>19#include <iterator>20#include <list>21#include <string>22#include <string_view>23#include <vector>24 25#include "benchmark/benchmark.h"26#include "test_macros.h"27 28const char* c_string_6_characters  = "abcdef";29const char* c_string_60_characters = "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef";30const char* c_string_6000_characters =31    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"32    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"33    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"34    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"35    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"36    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"37    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"38    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"39    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"40    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"41    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"42    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"43    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"44    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"45    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"46    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"47    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"48    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"49    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"50    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"51    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"52    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"53    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"54    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"55    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"56    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"57    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"58    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"59    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"60    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"61    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"62    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"63    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"64    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"65    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"66    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"67    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"68    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"69    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"70    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"71    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"72    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"73    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"74    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"75    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"76    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"77    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"78    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"79    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"80    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"81    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"82    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"83    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"84    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"85    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"86    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"87    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"88    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"89    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"90    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"91    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"92    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"93    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"94    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"95    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"96    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"97    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"98    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"99    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"100    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"101    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"102    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"103    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"104    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"105    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"106    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"107    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"108    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"109    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"110    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"111    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"112    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"113    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"114    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"115    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"116    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"117    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"118    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"119    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"120    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"121    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"122    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"123    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"124    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"125    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"126    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"127    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"128    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"129    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"130    "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"; // 100 lines131 132std::string string_6_characters    = c_string_6_characters;133std::string string_60_characters   = c_string_60_characters;134std::string string_6000_characters = c_string_6000_characters;135 136std::string_view string_view_6_characters    = c_string_6_characters;137std::string_view string_view_60_characters   = c_string_60_characters;138std::string_view string_view_6000_characters = c_string_6000_characters;139 140static void BM_sprintf(benchmark::State& state, const char* value) {141  std::array<char, 10'000> output;142  for (auto _ : state)143    benchmark::DoNotOptimize(std::sprintf(output.data(), "%s", value));144}145 146template <class T>147static void BM_format(benchmark::State& state, const T& value) {148  for (auto _ : state)149    benchmark::DoNotOptimize(std::format("{}", value));150}151 152template <class Container, class T>153static void BM_format_to_back_inserter(benchmark::State& state, const T& value) {154  for (auto _ : state) {155    Container c;156    std::format_to(std::back_inserter(c), "{}", value);157    benchmark::DoNotOptimize(c);158  }159}160 161template <class T, class F>162static void BM_format_to_iterator(benchmark::State& state, const T& value, F&& f) {163  auto output = f();164  for (auto _ : state) {165    benchmark::DoNotOptimize(std::format_to(std::begin(output), "{}", value));166  }167}168 169#define FORMAT_BENCHMARKS(name, variable)                                                                              \170  BENCHMARK_CAPTURE(BM_format, name, variable);                                                                        \171                                                                                                                       \172  BENCHMARK_TEMPLATE1_CAPTURE(BM_format_to_back_inserter, std::string, name, variable);                                \173  BENCHMARK_TEMPLATE1_CAPTURE(BM_format_to_back_inserter, std::vector<char>, name, variable);                          \174  BENCHMARK_TEMPLATE1_CAPTURE(BM_format_to_back_inserter, std::deque<char>, name, variable);                           \175  BENCHMARK_TEMPLATE1_CAPTURE(BM_format_to_back_inserter, std::list<char>, name, variable);                            \176                                                                                                                       \177  BENCHMARK_CAPTURE(BM_format_to_iterator, <std::array> name, variable, ([] {                                          \178                      std::array<char, 10'000> a;                                                                      \179                      return a;                                                                                        \180                    }));                                                                                               \181  BENCHMARK_CAPTURE(BM_format_to_iterator, <std::string> name, variable, ([] {                                         \182                      std::string s;                                                                                   \183                      s.resize(10'000);                                                                                \184                      return s;                                                                                        \185                    }));                                                                                               \186  BENCHMARK_CAPTURE(BM_format_to_iterator, <std::vector> name, variable, ([] {                                         \187                      std::vector<char> v;                                                                             \188                      v.resize(10'000);                                                                                \189                      return v;                                                                                        \190                    }));                                                                                               \191  BENCHMARK_CAPTURE(BM_format_to_iterator, <std::deque> name, variable, ([] {                                          \192                      std::deque<char> d;                                                                              \193                      d.resize(10'000);                                                                                \194                      return d;                                                                                        \195                    }));                                                                                               \196                                                                                                                       \197  /* */198 199BENCHMARK_CAPTURE(BM_sprintf, C_string_len_6, c_string_6_characters);200FORMAT_BENCHMARKS(C_string_len_6, c_string_6_characters)201FORMAT_BENCHMARKS(string_len_6, string_6_characters)202FORMAT_BENCHMARKS(string_view_len_6, string_view_6_characters)203 204BENCHMARK_CAPTURE(BM_sprintf, C_string_len_60, c_string_60_characters);205FORMAT_BENCHMARKS(C_string_len_60, c_string_60_characters)206FORMAT_BENCHMARKS(string_len_60, string_60_characters)207FORMAT_BENCHMARKS(string_view_len_60, string_view_60_characters)208 209BENCHMARK_CAPTURE(BM_sprintf, C_string_len_6000, c_string_6000_characters);210FORMAT_BENCHMARKS(C_string_len_6000, c_string_6000_characters)211FORMAT_BENCHMARKS(string_len_6000, string_6000_characters)212FORMAT_BENCHMARKS(string_view_len_6000, string_view_6000_characters)213 214BENCHMARK_MAIN();215