//------------------------------------------------------------------- // buffer.cc //------------------------------------------------------------------- #include #include #include #include #include #include #include #include //------------------------------------------------------------------- const std::size_t SIZE = 1 << 20; int buffer[SIZE] = {0}; std::array myarray; std::vector myvector(SIZE); int *pointer1 = buffer, *pointer2 = myarray.data(), *pointer3 = myvector.data(), r = 0; struct Init { Init() { std::random_device device; std::default_random_engine engine(device()); std::uniform_int_distribution<> distribution; auto rng = std::bind(distribution, engine); std::generate(buffer, buffer + SIZE, rng); std::copy(buffer, buffer + SIZE, myarray.begin()); std::copy(buffer, buffer + SIZE, myvector.begin()); } } init; //------------------------------------------------------------------- template T f1(T *p, std::size_t n) { return p[n]; } template T f2(T *p, std::size_t n) { if (n >= SIZE) throw std::out_of_range(std::to_string(n) + " >= " + std::to_string(SIZE)); return f1(p, n); } template T f1(const Container &c, std::size_t n) { return c[n]; } template T f2(const Container &c, std::size_t n) { return c.at(n); } //------------------------------------------------------------------- template static void test(benchmark::State &state) { for (auto _ : state) { r = 0; for (std::size_t i = 0; i < SIZE; ++i) r += function(container, i); } state.SetLabel("result = " + std::to_string(r)); } //------------------------------------------------------------------- BENCHMARK(test, buffer>); BENCHMARK(test, buffer>); BENCHMARK(test, pointer1>); BENCHMARK(test, pointer1>); BENCHMARK(test>, myarray>); BENCHMARK(test>, myarray>); BENCHMARK(test, pointer2>); BENCHMARK(test, pointer2>); BENCHMARK(test>, myvector>); BENCHMARK(test>, myvector>); BENCHMARK(test, pointer3>); BENCHMARK(test, pointer3>); //------------------------------------------------------------------- BENCHMARK_MAIN(); //-------------------------------------------------------------------