|  | // 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; | 
|  | } | 
|  |  |