| // SPDX-FileCopyrightText: The Eigen Authors | |
| // SPDX-License-Identifier: MPL-2.0 | |
| #include <benchmark/benchmark.h> | |
| #include <Eigen/Core> | |
| #include "../../test/MovableScalar.h" | |
| #include <utility> | |
| template <typename MatrixType> | |
| void copy_matrix(MatrixType& m) { | |
| MatrixType tmp(m); | |
| m = tmp; | |
| } | |
| template <typename MatrixType> | |
| void move_matrix(MatrixType&& m) { | |
| MatrixType tmp(std::move(m)); | |
| m = std::move(tmp); | |
| } | |
| template <typename Scalar> | |
| static void BM_CopySemantics(benchmark::State& state) { | |
| using MatrixType = Eigen::Matrix<Eigen::MovableScalar<Scalar>, 1, 10>; | |
| MatrixType data = MatrixType::Random().eval(); | |
| for (auto _ : state) { | |
| copy_matrix(data); | |
| benchmark::DoNotOptimize(data.data()); | |
| } | |
| } | |
| template <typename Scalar> | |
| static void BM_MoveSemantics(benchmark::State& state) { | |
| using MatrixType = Eigen::Matrix<Eigen::MovableScalar<Scalar>, 1, 10>; | |
| MatrixType data = MatrixType::Random().eval(); | |
| for (auto _ : state) { | |
| move_matrix(std::move(data)); | |
| benchmark::DoNotOptimize(data.data()); | |
| } | |
| } | |
| BENCHMARK(BM_CopySemantics<float>); | |
| BENCHMARK(BM_MoveSemantics<float>); | |
| BENCHMARK(BM_CopySemantics<double>); | |
| BENCHMARK(BM_MoveSemantics<double>); |