| #include <iostream> | 
 | #include <Eigen/Core> | 
 | #include <Eigen/Geometry> | 
 | #include <bench/BenchTimer.h> | 
 |  | 
 | using namespace Eigen;  | 
 |  | 
 | template<typename Quat> | 
 | EIGEN_DONT_INLINE void quatmul_default(const Quat& a, const Quat& b, Quat& c) | 
 | { | 
 |   c = a * b; | 
 | } | 
 |  | 
 | template<typename Quat> | 
 | EIGEN_DONT_INLINE void quatmul_novec(const Quat& a, const Quat& b, Quat& c) | 
 | { | 
 |   c = internal::quat_product<0, Quat, Quat, typename Quat::Scalar, Aligned>::run(a,b); | 
 | } | 
 |  | 
 | template<typename Quat> void bench(const std::string& label) | 
 | { | 
 |   int tries = 10; | 
 |   int rep = 1000000; | 
 |   BenchTimer t; | 
 |    | 
 |   Quat a(4, 1, 2, 3); | 
 |   Quat b(2, 3, 4, 5); | 
 |   Quat c; | 
 |    | 
 |   std::cout.precision(3); | 
 |    | 
 |   BENCH(t, tries, rep, quatmul_default(a,b,c)); | 
 |   std::cout << label << " default " << 1e3*t.best(CPU_TIMER) << "ms  \t" << 1e-6*double(rep)/(t.best(CPU_TIMER)) << " M mul/s\n"; | 
 |    | 
 |   BENCH(t, tries, rep, quatmul_novec(a,b,c)); | 
 |   std::cout << label << " novec   " << 1e3*t.best(CPU_TIMER) << "ms  \t" << 1e-6*double(rep)/(t.best(CPU_TIMER)) << " M mul/s\n"; | 
 | } | 
 |  | 
 | int main() | 
 | { | 
 |   bench<Quaternionf>("float "); | 
 |   bench<Quaterniond>("double"); | 
 |  | 
 |   return 0; | 
 |  | 
 | } | 
 |  |