| /* | |
| * Copyright (C) 2016 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #include <stdint.h> | |
| #include <map> | |
| #include <unordered_map> | |
| #include "benchmark/benchmark.h" | |
| namespace android { | |
| template <class Map = std::unordered_map<uint32_t, std::vector<uint32_t>>> | |
| static Map prepare_map() { | |
| Map map; | |
| std::vector<uint32_t> vec; | |
| for (int i = 0; i < 1000; ++i) { | |
| map.emplace(i, vec); | |
| } | |
| return map; | |
| } | |
| static void BM_hashmap_emplace_same(benchmark::State& state) { | |
| auto map = prepare_map<>(); | |
| auto val = map.size() - 1; | |
| std::vector<uint32_t> vec; | |
| for (auto&& _ : state) { | |
| benchmark::DoNotOptimize(map.emplace(val, vec)); | |
| } | |
| } | |
| BENCHMARK(BM_hashmap_emplace_same); | |
| static void BM_hashmap_try_emplace_same(benchmark::State& state) { | |
| auto map = prepare_map(); | |
| auto val = map.size() - 1; | |
| for (auto&& _ : state) { | |
| benchmark::DoNotOptimize(map.try_emplace(val)); | |
| } | |
| } | |
| BENCHMARK(BM_hashmap_try_emplace_same); | |
| static void BM_hashmap_find(benchmark::State& state) { | |
| auto map = prepare_map<>(); | |
| auto val = map.size() - 1; | |
| for (auto&& _ : state) { | |
| benchmark::DoNotOptimize(map.find(val)); | |
| } | |
| } | |
| BENCHMARK(BM_hashmap_find); | |
| static void BM_hashmap_emplace_diff(benchmark::State& state) { | |
| auto map = prepare_map<>(); | |
| std::vector<uint32_t> vec; | |
| auto i = map.size(); | |
| for (auto&& _ : state) { | |
| map.emplace(i++, vec); | |
| } | |
| } | |
| BENCHMARK(BM_hashmap_emplace_diff); | |
| static void BM_hashmap_try_emplace_diff(benchmark::State& state) { | |
| auto map = prepare_map(); | |
| auto i = map.size(); | |
| for (auto&& _ : state) { | |
| map.try_emplace(i++); | |
| } | |
| } | |
| BENCHMARK(BM_hashmap_try_emplace_diff); | |
| static void BM_hashmap_find_emplace_diff(benchmark::State& state) { | |
| auto map = prepare_map<>(); | |
| std::vector<uint32_t> vec; | |
| auto i = map.size(); | |
| for (auto&& _ : state) { | |
| if (map.find(i++) == map.end()) { | |
| map.emplace(i - 1, vec); | |
| } | |
| } | |
| } | |
| BENCHMARK(BM_hashmap_find_emplace_diff); | |
| static void BM_treemap_emplace_same(benchmark::State& state) { | |
| auto map = prepare_map<std::map<uint32_t, std::vector<uint32_t>>>(); | |
| auto val = map.size() - 1; | |
| std::vector<uint32_t> vec; | |
| for (auto&& _ : state) { | |
| benchmark::DoNotOptimize(map.emplace(val, vec)); | |
| } | |
| } | |
| BENCHMARK(BM_treemap_emplace_same); | |
| static void BM_treemap_try_emplace_same(benchmark::State& state) { | |
| auto map = prepare_map<std::map<uint32_t, std::vector<uint32_t>>>(); | |
| auto val = map.size() - 1; | |
| for (auto&& _ : state) { | |
| benchmark::DoNotOptimize(map.try_emplace(val)); | |
| } | |
| } | |
| BENCHMARK(BM_treemap_try_emplace_same); | |
| static void BM_treemap_find(benchmark::State& state) { | |
| auto map = prepare_map<std::map<uint32_t, std::vector<uint32_t>>>(); | |
| auto val = map.size() - 1; | |
| for (auto&& _ : state) { | |
| benchmark::DoNotOptimize(map.find(val)); | |
| } | |
| } | |
| BENCHMARK(BM_treemap_find); | |
| static void BM_treemap_emplace_diff(benchmark::State& state) { | |
| auto map = prepare_map<std::map<uint32_t, std::vector<uint32_t>>>(); | |
| std::vector<uint32_t> vec; | |
| auto i = map.size(); | |
| for (auto&& _ : state) { | |
| map.emplace(i++, vec); | |
| } | |
| } | |
| BENCHMARK(BM_treemap_emplace_diff); | |
| static void BM_treemap_try_emplace_diff(benchmark::State& state) { | |
| auto map = prepare_map(); | |
| auto i = map.size(); | |
| for (auto&& _ : state) { | |
| map.try_emplace(i++); | |
| } | |
| } | |
| BENCHMARK(BM_treemap_try_emplace_diff); | |
| static void BM_treemap_find_emplace_diff(benchmark::State& state) { | |
| auto map = prepare_map(); | |
| std::vector<uint32_t> vec; | |
| auto i = map.size(); | |
| for (auto&& _ : state) { | |
| if (map.find(i++) == map.end()) { | |
| map.emplace(i - 1, vec); | |
| } | |
| } | |
| } | |
| BENCHMARK(BM_treemap_find_emplace_diff); | |
| } // namespace android |