/***************************************************************************
* Copyright (c) 2016, Johan Mabille, Sylvain Corlay and Wolf Vollprecht *
* *
* Distributed under the terms of the BSD 3-Clause License. *
* *
* The full license is in the file LICENSE, distributed with this software. *
****************************************************************************/
#include
#include "xtensor/containers/xarray.hpp"
#include "xtensor/containers/xtensor.hpp"
#include "xtensor/core/xnoalias.hpp"
namespace xt
{
template
inline auto builder_xarange(benchmark::State& state)
{
for (auto _ : state)
{
T res = xt::arange(0, 10000);
benchmark::DoNotOptimize(res.storage().data());
}
}
template
inline auto builder_xarange_manual(benchmark::State& state)
{
for (auto _ : state)
{
T res = T::from_shape({10000});
for (std::size_t i = 0; i < 10000; ++i)
{
res.storage()[i] = i;
}
benchmark::DoNotOptimize(res.data());
}
}
inline auto builder_iota_vector(benchmark::State& state)
{
for (auto _ : state)
{
xt::uvector a{};
a.resize(10000);
std::iota(a.begin(), a.end(), 0);
benchmark::DoNotOptimize(a.data());
}
}
template
inline auto builder_arange_for_loop_assign(benchmark::State& state)
{
for (auto _ : state)
{
auto expr = xt::arange(0, 10000);
T res = T::from_shape({10000});
for (std::size_t i = 0; i < 10000; ++i)
{
res(i) = expr(i);
}
benchmark::DoNotOptimize(res.data());
}
}
template
inline auto builder_arange_for_loop_iter_assign(benchmark::State& state)
{
for (auto _ : state)
{
auto expr = xt::arange(0, 10000);
T res = T::from_shape({10000});
auto xend = expr.cend();
auto reit = res.begin();
for (auto it = expr.cbegin(); it != xend; ++it)
{
*reit++ = *it;
}
benchmark::DoNotOptimize(res.data());
}
}
template
inline auto builder_arange_for_loop_iter_assign_backward(benchmark::State& state)
{
for (auto _ : state)
{
auto expr = xt::arange(0, 10000);
T res = T::from_shape({10000});
auto xend = expr.cend();
auto reit = res.begin();
auto it = expr.cbegin();
for (ptrdiff_t n = 10000; n > 0; --n)
{
*reit = *it;
++it;
++reit;
}
benchmark::DoNotOptimize(res.data());
}
}
template
inline auto builder_arange_assign_iterator(benchmark::State& state)
{
for (auto _ : state)
{
auto xa = xt::arange(0, 10000);
T res = T::from_shape({10000});
std::copy(xa.cbegin(), xa.cend(), res.begin());
benchmark::DoNotOptimize(res.data());
}
}
template
inline auto builder_std_iota(benchmark::State& state)
{
for (auto _ : state)
{
T res = T::from_shape({10000});
std::iota(res.begin(), res.end(), 0);
benchmark::DoNotOptimize(res.data());
}
}
inline auto builder_ones(benchmark::State& state)
{
for (auto _ : state)
{
xt::xarray res = xt::ones({200, 200});
benchmark::DoNotOptimize(res.data());
}
}
inline auto builder_ones_assign_iterator(benchmark::State& state)
{
auto xo = xt::ones({200, 200});
for (auto _ : state)
{
xt::xarray res(xt::dynamic_shape{200, 200});
auto xo = xt::ones({200, 200});
std::copy(xo.begin(), xo.end(), res.begin());
benchmark::DoNotOptimize(res.storage().data());
}
}
inline auto builder_ones_expr_for(benchmark::State& state)
{
auto xo = xt::ones({200, 200});
for (auto _ : state)
{
xt::xtensor res(xt::static_shape({200, 200}));
auto xo = xt::ones({200, 200}) * 0.15;
for (std::size_t i = 0; i < xo.shape()[0]; ++i)
{
for (std::size_t j = 0; j < xo.shape()[1]; ++j)
{
res(i, j) = xo(i, j);
}
}
benchmark::DoNotOptimize(res.storage().data());
}
}
inline auto builder_ones_expr(benchmark::State& state)
{
auto xo = xt::ones({200, 200});
for (auto _ : state)
{
xt::xtensor res = xt::ones({200, 200}) * 0.15;
benchmark::DoNotOptimize(res.storage().data());
}
}
inline auto builder_ones_expr_fill(benchmark::State& state)
{
auto xo = xt::ones({200, 200});
for (auto _ : state)
{
xt::xtensor res = xt::xtensor::from_shape({200, 200});
std::fill(res.begin(), res.end(), 0.15);
benchmark::DoNotOptimize(res.storage().data());
}
}
inline auto builder_std_fill(benchmark::State& state)
{
for (auto _ : state)
{
xt::xarray res(xt::dynamic_shape{200, 200});
std::fill(res.begin(), res.end(), 1);
benchmark::DoNotOptimize(res.storage().data());
}
}
BENCHMARK_TEMPLATE(builder_xarange, xarray);
BENCHMARK_TEMPLATE(builder_xarange, xtensor);
BENCHMARK_TEMPLATE(builder_xarange_manual, xarray);
BENCHMARK_TEMPLATE(builder_xarange_manual, xtensor);
BENCHMARK_TEMPLATE(builder_arange_for_loop_assign, xarray);
BENCHMARK_TEMPLATE(builder_arange_for_loop_assign, xtensor);
BENCHMARK_TEMPLATE(builder_arange_assign_iterator, xarray);
BENCHMARK_TEMPLATE(builder_arange_assign_iterator, xtensor);
BENCHMARK_TEMPLATE(builder_arange_for_loop_iter_assign, xarray);
BENCHMARK_TEMPLATE(builder_arange_for_loop_iter_assign_backward, xarray);
BENCHMARK_TEMPLATE(builder_arange_for_loop_iter_assign, xtensor);
BENCHMARK_TEMPLATE(builder_arange_for_loop_iter_assign_backward, xtensor);
BENCHMARK_TEMPLATE(builder_std_iota, xarray);
BENCHMARK(builder_iota_vector);
BENCHMARK(builder_ones);
BENCHMARK(builder_ones_assign_iterator);
BENCHMARK(builder_ones_expr);
BENCHMARK(builder_ones_expr_fill);
BENCHMARK(builder_ones_expr_for);
BENCHMARK(builder_std_fill);
}