str_join_benchmark.cc (3225B)
1 // 2 // Copyright 2018 The Abseil Authors. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // https://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 #include <string> 17 #include <tuple> 18 #include <utility> 19 #include <vector> 20 21 #include "absl/strings/str_join.h" 22 #include "benchmark/benchmark.h" 23 24 namespace { 25 26 void BM_Join2_Strings(benchmark::State& state) { 27 const int string_len = state.range(0); 28 const int num_strings = state.range(1); 29 const std::string s(string_len, 'x'); 30 const std::vector<std::string> v(num_strings, s); 31 for (auto _ : state) { 32 std::string s = absl::StrJoin(v, "-"); 33 benchmark::DoNotOptimize(s); 34 } 35 } 36 BENCHMARK(BM_Join2_Strings) 37 ->ArgPair(1 << 0, 1 << 3) 38 ->ArgPair(1 << 10, 1 << 3) 39 ->ArgPair(1 << 13, 1 << 3) 40 ->ArgPair(1 << 0, 1 << 10) 41 ->ArgPair(1 << 10, 1 << 10) 42 ->ArgPair(1 << 13, 1 << 10) 43 ->ArgPair(1 << 0, 1 << 13) 44 ->ArgPair(1 << 10, 1 << 13) 45 ->ArgPair(1 << 13, 1 << 13); 46 47 void BM_Join2_Ints(benchmark::State& state) { 48 const int num_ints = state.range(0); 49 const std::vector<int> v(num_ints, 42); 50 for (auto _ : state) { 51 std::string s = absl::StrJoin(v, "-"); 52 benchmark::DoNotOptimize(s); 53 } 54 } 55 BENCHMARK(BM_Join2_Ints)->Range(0, 1 << 13); 56 57 void BM_Join2_KeysAndValues(benchmark::State& state) { 58 const int string_len = state.range(0); 59 const int num_pairs = state.range(1); 60 const std::string s(string_len, 'x'); 61 const std::vector<std::pair<std::string, int>> v(num_pairs, 62 std::make_pair(s, 42)); 63 for (auto _ : state) { 64 std::string s = absl::StrJoin(v, ",", absl::PairFormatter("=")); 65 benchmark::DoNotOptimize(s); 66 } 67 } 68 BENCHMARK(BM_Join2_KeysAndValues) 69 ->ArgPair(1 << 0, 1 << 3) 70 ->ArgPair(1 << 10, 1 << 3) 71 ->ArgPair(1 << 13, 1 << 3) 72 ->ArgPair(1 << 0, 1 << 10) 73 ->ArgPair(1 << 10, 1 << 10) 74 ->ArgPair(1 << 13, 1 << 10) 75 ->ArgPair(1 << 0, 1 << 13) 76 ->ArgPair(1 << 10, 1 << 13) 77 ->ArgPair(1 << 13, 1 << 13); 78 79 void BM_JoinStreamable(benchmark::State& state) { 80 const int string_len = state.range(0); 81 const int num_strings = state.range(1); 82 const std::vector<std::string> v(num_strings, std::string(string_len, 'x')); 83 for (auto _ : state) { 84 std::string s = absl::StrJoin(v, "", absl::StreamFormatter()); 85 benchmark::DoNotOptimize(s); 86 } 87 } 88 BENCHMARK(BM_JoinStreamable) 89 ->ArgPair(0, 0) 90 ->ArgPair(16, 1) 91 ->ArgPair(256, 1) 92 ->ArgPair(16, 16) 93 ->ArgPair(256, 16) 94 ->ArgPair(16, 256) 95 ->ArgPair(256, 256); 96 97 void BM_JoinTuple(benchmark::State& state) { 98 for (auto _ : state) { 99 std::string s = 100 absl::StrJoin(std::make_tuple(123456789, 987654321, 24680, 13579), "/"); 101 benchmark::DoNotOptimize(s); 102 } 103 } 104 BENCHMARK(BM_JoinTuple); 105 106 } // namespace