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