From 71edf37f648030f582778abcf100960f844e1682 Mon Sep 17 00:00:00 2001
From: Guilhem Saurel <guilhem.saurel@gmail.com>
Date: Mon, 23 Jul 2018 14:14:14 +0200
Subject: [PATCH] google benchmark

---
 .gitmodules                 |  6 ++++++
 CMakeLists.txt              |  3 ++-
 README.md                   | 24 +++++++++++++++++------
 benchmark                   |  1 +
 src/CMakeLists.txt          |  6 ++++++
 src/pinocchio-benchmark.cpp | 38 +++++++++++++++++++++++++++++++++++++
 6 files changed, 71 insertions(+), 7 deletions(-)
 create mode 160000 benchmark
 create mode 100644 src/pinocchio-benchmark.cpp

diff --git a/.gitmodules b/.gitmodules
index 1571b0d..40ee538 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,3 +4,9 @@
 [submodule "libs/pinocchio"]
 	path = libs/pinocchio
 	url = https://github.com/stack-of-tasks/pinocchio.git
+[submodule "benchmark"]
+	path = benchmark
+	url = https://github.com/google/benchmark.git
+[submodule "googletest"]
+	path = googletest
+	url = https://github.com/google/googletest.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 43773d2..c502dcb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,6 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
 
 SET (CXX_DISABLE_WERROR ON)
-set (CMAKE_CXX_STANDARD 11)
 
 INCLUDE(cmake/base.cmake)
 
@@ -16,6 +15,8 @@ ADD_REQUIRED_DEPENDENCY("eigen3")
 ADD_REQUIRED_DEPENDENCY("pinocchio")
 ADD_REQUIRED_DEPENDENCY("rbdl")
 ADD_REQUIRED_DEPENDENCY("orocos-kdl")
+ADD_REQUIRED_DEPENDENCY("urdfdom")
+ADD_REQUIRED_DEPENDENCY("benchmark")
 
 ADD_SUBDIRECTORY("src")
 
diff --git a/README.md b/README.md
index 8071ad2..96a0d6b 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@ git submodule update --init --recursive
 ```
 mkdir -p build/pinocchio
 pushd build/pinocchio
-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_CXX_STANDARD=11 ../../libs/pinocchio
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_PYTHON_INTERFACE=OFF -DBUILD_UNIT_TESTS=OFF ../../libs/pinocchio
 make -j8 install
 popd
 ```
@@ -44,7 +44,7 @@ popd
 ```
 mkdir -p build/kdl
 pushd build/kdl
-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX ../../libs/kdl/orocos_kdl
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_INSTALL_LIBDIR=lib ../../libs/kdl/orocos_kdl
 make -j8 install
 popd
 ```
@@ -67,7 +67,19 @@ mv rbdl-rbdl-* libs/rbdl
 ```
 mkdir -p build/rbdl
 pushd build/rbdl
-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DRBDL_BUILD_ADDON_URDFREADER=ON ../../libs/rbdl
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_INSTALL_LIBDIR=lib -DRBDL_BUILD_ADDON_URDFREADER=ON ../../libs/rbdl
+make -j8 install
+popd
+```
+
+## Google Benchmark
+
+### Installing
+
+```
+mkdir -p build/google-benchmark
+pushd build/google-benchmark
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_INSTALL_LIBDIR=lib -DBENCHMARK_ENABLE_GTEST_TESTS=OFF ../../benchmark
 make -j8 install
 popd
 ```
@@ -77,9 +89,9 @@ popd
 ### Installing
 
 ```
-mkdir -p build/benchmarks
-pushd build/benchmarks
-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_PREFIX_PATH=$PREFIX ../..
+mkdir -p build/pinocchio-benchmarks
+pushd build/pinocchio-benchmarks
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_PREFIX_PATH=$PREFIX ../..
 make -j8 install
 popd
 ```
diff --git a/benchmark b/benchmark
new file mode 160000
index 0000000..1f35fa4
--- /dev/null
+++ b/benchmark
@@ -0,0 +1 @@
+Subproject commit 1f35fa4aa71bffb5e5672f7ca876561d6adef4fd
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 58b9779..fc15aca 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -8,3 +8,9 @@ INSTALL(TARGETS rbdl-bench RUNTIME DESTINATION bin)
 ADD_EXECUTABLE(pinocchio-bench pinocchio-bench)
 PKG_CONFIG_USE_DEPENDENCY(pinocchio-bench pinocchio)
 INSTALL(TARGETS pinocchio-bench RUNTIME DESTINATION bin)
+
+# Pinocchio & benchmark
+ADD_EXECUTABLE(pinocchio-benchmark pinocchio-benchmark)
+PKG_CONFIG_USE_DEPENDENCY(pinocchio-bench pinocchio)
+PKG_CONFIG_USE_DEPENDENCY(pinocchio-bench benchmark)
+INSTALL(TARGETS pinocchio-benchmark RUNTIME DESTINATION bin)
diff --git a/src/pinocchio-benchmark.cpp b/src/pinocchio-benchmark.cpp
new file mode 100644
index 0000000..5f1c68b
--- /dev/null
+++ b/src/pinocchio-benchmark.cpp
@@ -0,0 +1,38 @@
+#include <iostream>
+#include <fstream>
+
+#include <benchmark/benchmark.h>
+
+#include <pinocchio/multibody/model.hpp>
+#include <pinocchio/parsers/urdf.hpp>
+#include <pinocchio/algorithm/rnea.hpp>
+#include <pinocchio/algorithm/aba.hpp>
+
+static void BM_Pinocchio_RNEA(benchmark::State& state)
+{
+  se3::Model model;
+
+  // Load an urdf file provided by the user
+  se3::urdf::buildModel("models/simple_humanoid.urdf", se3::JointModelFreeFlyer(), model);
+  std::cout << "Pinocchio Benchmark" << std::endl;
+  std::cout << "  model: " << "models/simple_humanoid.urdf" << std::endl;
+  std::cout << "  nq: " << model.nq << std::endl;
+  std::cout << "  nv: " << model.nv << std::endl;
+
+  se3::Data data(model);
+
+  for (auto _: state)
+  {
+    Eigen::VectorXd q = Eigen::VectorXd::Random(model.nq);
+    Eigen::VectorXd qdot = Eigen::VectorXd::Random(model.nv);
+    Eigen::VectorXd tau = Eigen::VectorXd::Random(model.nv);
+    Eigen::VectorXd qddot = Eigen::VectorXd::Random(model.nv);
+
+    se3::aba(model, data, q, qdot, tau);
+    //std::cout << "qddot after ABA: " << data.ddq.transpose() << std::endl;
+  }
+}
+
+BENCHMARK(BM_Pinocchio_RNEA);
+
+BENCHMARK_MAIN();
-- 
GitLab