| // This file is part of Eigen, a lightweight C++ template library | 
 | // for linear algebra. | 
 | // | 
 | // Copyright (C) 2020 Sebastien Boisvert <seb@boisvert.info> | 
 | // | 
 | // This Source Code Form is subject to the terms of the Mozilla | 
 | // Public License v. 2.0. If a copy of the MPL was not distributed | 
 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | 
 |  | 
 | #include "BenchTimer.h" | 
 | #include "../test/MovableScalar.h" | 
 |  | 
 | #include <Eigen/Core> | 
 |  | 
 | #include <iostream> | 
 | #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> | 
 | void bench(const std::string& label) { | 
 |   using MatrixType = Eigen::Matrix<Eigen::MovableScalar<Scalar>, 1, 10>; | 
 |   Eigen::BenchTimer t; | 
 |  | 
 |   int tries = 10; | 
 |   int rep = 1000000; | 
 |  | 
 |   MatrixType data = MatrixType::Random().eval(); | 
 |   MatrixType dest; | 
 |  | 
 |   BENCH(t, tries, rep, copy_matrix(data)); | 
 |   std::cout << label << " copy semantics: " << 1e3 * t.best(Eigen::CPU_TIMER) << " ms" << std::endl; | 
 |  | 
 |   BENCH(t, tries, rep, move_matrix(std::move(data))); | 
 |   std::cout << label << " move semantics: " << 1e3 * t.best(Eigen::CPU_TIMER) << " ms" << std::endl; | 
 | } | 
 |  | 
 | int main() { | 
 |   bench<float>("float"); | 
 |   bench<double>("double"); | 
 |   return 0; | 
 | } |