// // immer: immutable data structures for C++ // Copyright (C) 2016, 2017, 2018 Juan Pedro Bolivar Puente // // This software is distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE or copy at http://boost.org/LICENSE_1_0.txt // #pragma once #include "benchmark/vector/common.hpp" #include #if IMMER_BENCHMARK_BOOST_COROUTINE #include #endif namespace { template auto benchmark_access_reduce_chunkedseq() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v.push_back(i); return [=] { auto init = 0u; v.for_each_segment([&] (auto first, auto last) { init = std::accumulate(first, last, init); }); return init; }; }; } template auto benchmark_access_iter_std() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v.push_back(i); return [=] { auto volatile x = std::accumulate(v.begin(), v.end(), 0u); return x; }; }; } template auto benchmark_access_idx_std() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v.push_back(i); return [=] { auto r = 0u; for (auto i = 0u; i < n; ++i) r += v[i]; volatile auto rr = r; return rr; }; }; } template auto benchmark_access_random_std() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; auto g = make_generator(n); for (auto i = 0u; i < n; ++i) v.push_back(i); return [=] { auto r = 0u; for (auto i = 0u; i < n; ++i) r += v[g[i]]; volatile auto rr = r; return rr; }; }; } template auto benchmark_access_iter() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v = PushFn{}(std::move(v), i); return [=] { auto volatile x = std::accumulate(v.begin(), v.end(), 0u); return x; }; }; } #if IMMER_BENCHMARK_BOOST_COROUTINE template auto benchmark_access_coro() { return [] (nonius::parameters params) { using coro_t = typename boost::coroutines2::coroutine; auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v = PushFn{}(std::move(v), i); return [=] { auto c = coro_t::pull_type { [&](auto& sink) { v.for_each_chunk([&](auto f, auto l) { for (; f != l; ++f) sink(*f); }); }}; auto volatile x = std::accumulate(begin(c), end(c), 0u); return x; }; }; } #endif template auto benchmark_access_idx() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v = PushFn{}(std::move(v), i); return [=] { auto r = 0u; for (auto i = 0u; i < n; ++i) r += v[i]; volatile auto rr = r; return rr; }; }; } template auto benchmark_access_reduce() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v = PushFn{}(std::move(v), i); return [=] { auto volatile x = immer::accumulate(v, 0u); return x; }; }; } template auto benchmark_access_reduce_range() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v = PushFn{}(std::move(v), i); return [=] { auto volatile x = immer::accumulate(v.begin(), v.end(), 0u); return x; }; }; } template auto benchmark_access_random() { return [] (nonius::parameters params) { auto n = params.get(); auto v = Vektor{}; for (auto i = 0u; i < n; ++i) v = PushFn{}(std::move(v), i); auto g = make_generator(n); return [=] { auto r = 0u; for (auto i = 0u; i < n; ++i) r += v[g[i]]; volatile auto rr = r; return rr; }; }; } template auto benchmark_access_librrb(Fn maker) { return [=] (nonius::parameters params) { auto n = params.get(); auto v = maker(n); return [=] { auto r = 0u; for (auto i = 0u; i < n; ++i) r += reinterpret_cast(rrb_nth(v, i)); volatile auto rr = r; return rr; }; }; } template auto benchmark_access_random_librrb(Fn maker) { return [=] (nonius::parameters params) { auto n = params.get(); auto v = maker(n); auto g = make_generator(n); return [=] { auto r = 0u; for (auto i = 0u; i < n; ++i) r += reinterpret_cast(rrb_nth(v, g[i])); volatile auto rr = r; return rr; }; }; } } // anonymous namespace