15 #include "absl/strings/string_view.h"
22 #include <unordered_set>
25 #include "benchmark/benchmark.h"
26 #include "absl/base/attributes.h"
27 #include "absl/base/internal/raw_logging.h"
28 #include "absl/base/macros.h"
29 #include "absl/strings/str_cat.h"
49 BENCHMARK(BM_StringViewFromString)->Arg(12)->Arg(128);
68 DoEqualityComparisons(
state,
x,
x);
70 BENCHMARK(BM_EqualIdentical)->DenseRange(0, 3)->Range(4, 1 << 10);
75 DoEqualityComparisons(
state,
x,
y);
92 DoEqualityComparisons(
state,
x,
y);
94 BENCHMARK(BM_EqualDifferent)->DenseRange(0, 3)->Range(4, 1 << 10);
119 DoConstantSizeInlinedEqualityComparisons(
state,
x);
123 BENCHMARK(BM_EqualConstantSizeInlined)->DenseRange(2, 4);
146 DoConstantSizeNonInlinedEqualityComparisons(
state,
x);
150 BENCHMARK(BM_EqualConstantSizeNonInlined)->DenseRange(2, 4);
155 for (
int i = 0;
i <
len;
i++) {
168 BENCHMARK(BM_CompareSame)->DenseRange(0, 3)->Range(4, 1 << 10);
184 BENCHMARK(BM_CompareFirstOneLess)->DenseRange(1, 3)->Range(4, 1 << 10);
200 BENCHMARK(BM_CompareSecondOneLess)->DenseRange(1, 3)->Range(4, 1 << 10);
209 BENCHMARK(BM_find_string_view_len_one)->Range(1, 1 << 20);
218 BENCHMARK(BM_find_string_view_len_two)->Range(1, 1 << 20);
227 BENCHMARK(BM_find_one_char)->Range(1, 1 << 20);
236 BENCHMARK(BM_rfind_one_char)->Range(1, 1 << 20);
239 const int needle_len =
state.range(0);
241 for (
int i = 0;
i < needle_len; ++
i) {
253 BM_worst_case_find_first_of(
state, 10);
257 BM_worst_case_find_first_of(
state, 100);
261 BM_worst_case_find_first_of(
state, 1000);
264 BENCHMARK(BM_find_first_of_short)->DenseRange(0, 4)->Arg(8)->Arg(16)->Arg(32);
265 BENCHMARK(BM_find_first_of_medium)->DenseRange(0, 4)->Arg(8)->Arg(16)->Arg(32);
266 BENCHMARK(BM_find_first_of_long)->DenseRange(0, 4)->Arg(8)->Arg(16)->Arg(32);
268 struct EasyMap :
public std::map<absl::string_view, uint64_t> {
269 explicit EasyMap(
size_t) {}
278 template <
typename Map,
int WordsPerKey>
280 const int table_size =
state.range(0);
281 const double kFractionOfKeysThatAreHot = 0.2;
282 const int kNumLookupsOfHotKeys = 20;
283 const int kNumLookupsOfColdKeys = 1;
284 const char*
words[] = {
"the",
"quick",
"brown",
"fox",
"jumped",
285 "over",
"the",
"lazy",
"dog",
"and",
286 "found",
"a",
"large",
"mushroom",
"and",
287 "a",
"couple",
"crickets",
"eating",
"pie"};
289 std::random_device
r;
290 std::seed_seq
seed({
r(),
r(),
r(),
r(),
r(),
r(),
r(),
r()});
291 std::mt19937 rng(
seed);
292 std::vector<std::string>
keys(table_size);
293 std::vector<int> all_indices;
294 const int kBlockSize = 1 << 12;
295 std::unordered_set<std::string>
t(kBlockSize);
297 for (
int i = 0;
i < table_size;
i++) {
298 all_indices.push_back(
i);
301 for (
int j = 0;
j < WordsPerKey;
j++) {
304 }
while (!
t.insert(
keys[
i]).second);
309 std::shuffle(all_indices.begin(), all_indices.end(), rng);
310 const int num_hot = table_size * kFractionOfKeysThatAreHot;
311 const int num_cold = table_size - num_hot;
312 std::vector<int> hot_indices(all_indices.begin(),
313 all_indices.begin() + num_hot);
314 std::vector<int> indices;
315 for (
int i = 0;
i < kNumLookupsOfColdKeys;
i++) {
316 indices.insert(indices.end(), all_indices.begin(), all_indices.end());
318 for (
int i = 0;
i < kNumLookupsOfHotKeys - kNumLookupsOfColdKeys;
i++) {
319 indices.insert(indices.end(), hot_indices.begin(), hot_indices.end());
321 std::shuffle(indices.begin(), indices.end(), rng);
323 num_cold * kNumLookupsOfColdKeys + num_hot * kNumLookupsOfHotKeys ==
329 std::vector<std::string> test_strings(indices.size());
330 for (
int i = 0;
i < indices.size();
i++) {
331 test_strings[
i] =
keys[indices[
i]];
338 for (
int i = 0;
i < table_size;
i++) {
343 for (
int i = 0;
i < indices.size();
i++) {
344 sum +=
h[test_strings[
i]];
351 StringViewMapBenchmark<EasyMap, 4>(
state);
353 BENCHMARK(BM_StdMap_4)->Range(1 << 10, 1 << 16);
356 StringViewMapBenchmark<EasyMap, 8>(
state);
358 BENCHMARK(BM_StdMap_8)->Range(1 << 10, 1 << 16);
365 dst.assign(sv.begin(), sv.end());
368 BENCHMARK(BM_CopyToStringNative)->Range(1 << 3, 1 << 12);
376 dst.insert(
dst.end(), sv.begin(), sv.end());
379 BENCHMARK(BM_AppendToStringNative)->Range(1 << 3, 1 << 12);