Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
|
dyaroshev
2017/04/08 16:48:03
I will remove these benchmarks before merging. I'v
dyaroshev
2017/04/11 10:07:10
On 2017/04/08 16:48:03, dyaroshev wrote:
brettw
2017/04/26 21:48:51
You can add them to the //base:base_perftests targ
dyaroshev
2017/04/27 19:11:46
Unfortunately, it would break your builds. Google
| |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <numeric> | |
| 6 #include <vector> | |
| 7 | |
| 8 #include "base/algorithm/sorted_ranges.h" | |
| 9 #include "base/third_party/benchmark/include/benchmark/benchmark.h" | |
| 10 | |
| 11 namespace { | |
| 12 | |
| 13 template <class Iterator, class BinaryPredicate> | |
| 14 Iterator PreviousLastUnique(Iterator first, | |
| 15 Iterator last, | |
| 16 BinaryPredicate compare) { | |
| 17 if (first == last) | |
| 18 return last; | |
| 19 | |
| 20 Iterator dest = first; | |
| 21 Iterator cur = first; | |
| 22 Iterator prev = cur; | |
| 23 while (++cur != last) { | |
| 24 if (!compare(*prev, *cur)) { | |
| 25 // Non-identical one. | |
| 26 if (dest != prev) | |
| 27 *dest = std::move(*prev); | |
| 28 ++dest; | |
| 29 } | |
| 30 prev = cur; | |
| 31 } | |
| 32 | |
| 33 if (dest != prev) | |
| 34 *dest = std::move(*prev); | |
| 35 return ++dest; | |
| 36 } | |
| 37 | |
| 38 template <typename Functor> | |
| 39 void LastUniqueBenchmarkManyDuplicates(benchmark::State& state, Functor impl) { | |
| 40 std::vector<int> original_input; | |
| 41 | |
| 42 for (int i = 11; i < 1000000; ++i) { | |
| 43 for (int j = 0; j < i % 10; ++i) | |
| 44 original_input.push_back(i); | |
| 45 } | |
| 46 | |
| 47 while (state.KeepRunning()) { | |
| 48 state.PauseTiming(); | |
| 49 auto input = original_input; | |
| 50 state.ResumeTiming(); | |
| 51 impl(input); | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 template <typename Functor> | |
| 56 void LastUniqueBenchmarkNoDuplicates(benchmark::State& state, Functor impl) { | |
| 57 std::vector<int> original_input(1000000); | |
| 58 std::iota(original_input.begin(), original_input.end(), 0); | |
| 59 | |
| 60 while (state.KeepRunning()) { | |
| 61 state.PauseTiming(); | |
| 62 auto input = original_input; | |
| 63 state.ResumeTiming(); | |
| 64 impl(input); | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 BENCHMARK_CAPTURE(LastUniqueBenchmarkManyDuplicates, | |
| 69 one_cycle_and_if_many_duplicates, | |
| 70 [](std::vector<int>& in) { | |
| 71 PreviousLastUnique(in.begin(), in.end(), | |
| 72 std::equal_to<int>{}); | |
| 73 }); | |
| 74 | |
| 75 BENCHMARK_CAPTURE(LastUniqueBenchmarkManyDuplicates, | |
| 76 two_cycles_many_duplicates, | |
| 77 [](std::vector<int>& in) { | |
| 78 base::UniquePickLast(in.begin(), in.end()); | |
| 79 }); | |
| 80 | |
| 81 BENCHMARK_CAPTURE(LastUniqueBenchmarkNoDuplicates, | |
| 82 one_cycle_and_if_no_duplicates, | |
| 83 [](std::vector<int>& in) { | |
| 84 PreviousLastUnique(in.begin(), in.end(), | |
| 85 std::equal_to<int>{}); | |
| 86 }); | |
| 87 | |
| 88 BENCHMARK_CAPTURE(LastUniqueBenchmarkNoDuplicates, | |
| 89 two_cycles_no_duplicates, | |
| 90 [](std::vector<int>& in) { | |
| 91 base::UniquePickLast(in.begin(), in.end()); | |
| 92 }); | |
| 93 | |
| 94 } // namespace | |
| 95 | |
| 96 BENCHMARK_MAIN() | |
| OLD | NEW |