blob: fcf04c019c89ca65d4601fd05f5de33480768491 [file]
// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0
#include <benchmark/benchmark.h>
#include <Eigen/Core>
#include "../../test/MovableScalar.h"
#include <complex>
using Complex = std::complex<double>;
using NonTrivialScalar = Eigen::MovableScalar<Complex>;
template <typename Scalar, int Capacity>
static void BM_ConservativeResizeAppend(benchmark::State& state) {
using Vector = Eigen::Array<Scalar, Eigen::Dynamic, 1, Eigen::ColMajor, Capacity, 1>;
const Eigen::Index size = state.range(0);
const Scalar value(Complex(1, 2));
Vector v;
for (auto _ : state) {
v.resize(0);
for (Eigen::Index i = 0; i < size; ++i) {
v.conservativeResize(i + 1);
v(i) = value;
benchmark::DoNotOptimize(v.data());
benchmark::ClobberMemory();
}
}
for (Eigen::Index i = 0; i < size; ++i) {
if (Complex(v(i)) != Complex(1, 2)) state.SkipWithError("Appended coefficient was not preserved");
}
state.SetItemsProcessed(state.iterations() * size);
}
template <int Storage>
static void BM_ConservativeResizeOuter(benchmark::State& state) {
using BoundedMatrix = Eigen::Matrix<NonTrivialScalar, Eigen::Dynamic, Eigen::Dynamic, Storage,
Storage == Eigen::RowMajor ? 256 : 3, Storage == Eigen::RowMajor ? 3 : 256>;
const Eigen::Index size = state.range(0);
const NonTrivialScalar value(Complex(1, 2));
BoundedMatrix m;
for (auto _ : state) {
m.resize(Storage == Eigen::RowMajor ? 0 : 3, Storage == Eigen::RowMajor ? 3 : 0);
for (Eigen::Index i = 0; i < size; ++i) {
m.conservativeResize(Storage == Eigen::RowMajor ? i + 1 : 3, Storage == Eigen::RowMajor ? 3 : i + 1);
for (Eigen::Index j = 0; j < 3; ++j) m.data()[3 * i + j] = value;
benchmark::DoNotOptimize(m.data());
benchmark::ClobberMemory();
}
}
for (Eigen::Index i = 0; i < m.size(); ++i) {
if (Complex(m.data()[i]) != Complex(1, 2)) state.SkipWithError("Appended coefficient was not preserved");
}
state.SetItemsProcessed(state.iterations() * size * 3);
}
BENCHMARK_TEMPLATE(BM_ConservativeResizeAppend, Complex, 256)->Arg(16)->Arg(64)->Arg(200)->Arg(256);
BENCHMARK_TEMPLATE(BM_ConservativeResizeAppend, NonTrivialScalar, 256)->Arg(16)->Arg(64)->Arg(200)->Arg(256);
BENCHMARK_TEMPLATE(BM_ConservativeResizeAppend, NonTrivialScalar, Eigen::Dynamic)->Arg(16)->Arg(64)->Arg(200)->Arg(256);
BENCHMARK_TEMPLATE(BM_ConservativeResizeOuter, Eigen::RowMajor)->Arg(16)->Arg(64)->Arg(200)->Arg(256);
BENCHMARK_TEMPLATE(BM_ConservativeResizeOuter, Eigen::ColMajor)->Arg(16)->Arg(64)->Arg(200)->Arg(256);