/* * 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 #include #include #include "benchmark/benchmark.h" namespace android { template >> static Map prepare_map() { Map map; std::vector 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 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 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 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>>(); auto val = map.size() - 1; std::vector 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>>(); 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>>(); 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::vector 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 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