1*bf2c3715SXin Li // This file is part of Eigen, a lightweight C++ template library
2*bf2c3715SXin Li // for linear algebra.
3*bf2c3715SXin Li //
4*bf2c3715SXin Li // Copyright (C) 2020 Sebastien Boisvert <[email protected]>
5*bf2c3715SXin Li //
6*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla
7*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed
8*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9*bf2c3715SXin Li
10*bf2c3715SXin Li #include "BenchTimer.h"
11*bf2c3715SXin Li #include "../test/MovableScalar.h"
12*bf2c3715SXin Li
13*bf2c3715SXin Li #include <Eigen/Core>
14*bf2c3715SXin Li
15*bf2c3715SXin Li #include <iostream>
16*bf2c3715SXin Li #include <utility>
17*bf2c3715SXin Li
18*bf2c3715SXin Li template <typename MatrixType>
copy_matrix(MatrixType & m)19*bf2c3715SXin Li void copy_matrix(MatrixType& m)
20*bf2c3715SXin Li {
21*bf2c3715SXin Li MatrixType tmp(m);
22*bf2c3715SXin Li m = tmp;
23*bf2c3715SXin Li }
24*bf2c3715SXin Li
25*bf2c3715SXin Li template <typename MatrixType>
move_matrix(MatrixType && m)26*bf2c3715SXin Li void move_matrix(MatrixType&& m)
27*bf2c3715SXin Li {
28*bf2c3715SXin Li MatrixType tmp(std::move(m));
29*bf2c3715SXin Li m = std::move(tmp);
30*bf2c3715SXin Li }
31*bf2c3715SXin Li
32*bf2c3715SXin Li template<typename Scalar>
bench(const std::string & label)33*bf2c3715SXin Li void bench(const std::string& label)
34*bf2c3715SXin Li {
35*bf2c3715SXin Li using MatrixType = Eigen::Matrix<Eigen::MovableScalar<Scalar>,1,10>;
36*bf2c3715SXin Li Eigen::BenchTimer t;
37*bf2c3715SXin Li
38*bf2c3715SXin Li int tries = 10;
39*bf2c3715SXin Li int rep = 1000000;
40*bf2c3715SXin Li
41*bf2c3715SXin Li MatrixType data = MatrixType::Random().eval();
42*bf2c3715SXin Li MatrixType dest;
43*bf2c3715SXin Li
44*bf2c3715SXin Li BENCH(t, tries, rep, copy_matrix(data));
45*bf2c3715SXin Li std::cout << label << " copy semantics: " << 1e3*t.best(Eigen::CPU_TIMER) << " ms" << std::endl;
46*bf2c3715SXin Li
47*bf2c3715SXin Li BENCH(t, tries, rep, move_matrix(std::move(data)));
48*bf2c3715SXin Li std::cout << label << " move semantics: " << 1e3*t.best(Eigen::CPU_TIMER) << " ms" << std::endl;
49*bf2c3715SXin Li }
50*bf2c3715SXin Li
main()51*bf2c3715SXin Li int main()
52*bf2c3715SXin Li {
53*bf2c3715SXin Li bench<float>("float");
54*bf2c3715SXin Li bench<double>("double");
55*bf2c3715SXin Li return 0;
56*bf2c3715SXin Li }
57*bf2c3715SXin Li
58