diff --git a/CMakeLists.txt b/CMakeLists.txt index b8eb0f39..08e6fb63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,12 @@ add_subdirectory (src/OpenMesh/Core) add_subdirectory (src/OpenMesh/Tools) add_subdirectory (src/OpenMesh/Apps) +set(OPENMESH_BENCHMARK_DIR CACHE PATH "Source path of benchmark (https://github.com/google/benchmark).") +if (OPENMESH_BENCHMARK_DIR) + add_subdirectory(${OPENMESH_BENCHMARK_DIR} benchmark) + add_subdirectory(src/Benchmark) +endif() + # Do not build unit tests when build as external library if(${PROJECT_NAME} MATCHES "OpenMesh") add_subdirectory (src/Unittests) diff --git a/src/Benchmark/CMakeLists.txt b/src/Benchmark/CMakeLists.txt new file mode 100644 index 00000000..9332e561 --- /dev/null +++ b/src/Benchmark/CMakeLists.txt @@ -0,0 +1,11 @@ +set (SOURCES "") +list (APPEND SOURCES + main.cpp + VectorT_new.cpp + VectorT_legacy.cpp +) + +add_executable(OMBenchmark ${SOURCES}) +set_target_properties(OMBenchmark PROPERTIES + INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/..") +target_link_libraries(OMBenchmark benchmark OpenMeshCore) \ No newline at end of file diff --git a/src/Benchmark/VectorT.cpp b/src/Benchmark/VectorT.cpp new file mode 100644 index 00000000..0d70ab59 --- /dev/null +++ b/src/Benchmark/VectorT.cpp @@ -0,0 +1,29 @@ +/* + * VectorT.cpp + * + * Created on: Nov 19, 2015 + * Author: ebke + */ + +#ifndef BMPREFIX +#error "Do not compile directly." +#endif + +#define ASSEMBLE_(PREFIX, SUFFIX) PREFIX ## SUFFIX +#define ASSEMBLE(PREFIX, SUFFIX) ASSEMBLE_(PREFIX, SUFFIX) +#define MYBENCHMARK(NAME) BENCHMARK(NAME) + +static void ASSEMBLE(BMPREFIX, Vec3f_add_compare)(benchmark::State& state) { + OpenMesh::Vec3f v1(0, 0, 0); + OpenMesh::Vec3f v2(1000, 1000, 1000); + while (state.KeepRunning()) { + v1 += OpenMesh::Vec3f(1.1, 1.2, 1.3); + v2 -= OpenMesh::Vec3f(1.1, 1.2, 1.3); + if (v1 == v2) { + v1 -= v2; + v2 += v1; + } + } +} + +MYBENCHMARK (ASSEMBLE(BMPREFIX, Vec3f_add_compare)); diff --git a/src/Benchmark/VectorT_legacy.cpp b/src/Benchmark/VectorT_legacy.cpp new file mode 100644 index 00000000..9d8aa288 --- /dev/null +++ b/src/Benchmark/VectorT_legacy.cpp @@ -0,0 +1,14 @@ +/* + * VectorT_legacy.cpp + * + * Created on: Nov 19, 2015 + * Author: ebke + */ + +#include + +#define OPENMESH_VECTOR_LEGACY +#include + +#define BMPREFIX Legacy_ +#include "VectorT.cpp" diff --git a/src/Benchmark/VectorT_new.cpp b/src/Benchmark/VectorT_new.cpp new file mode 100644 index 00000000..ae303634 --- /dev/null +++ b/src/Benchmark/VectorT_new.cpp @@ -0,0 +1,12 @@ +/* + * VectorT_new.cpp + * + * Created on: Nov 19, 2015 + * Author: ebke + */ + +#include +#include + +#define BMPREFIX CPP11_ +#include "VectorT.cpp" diff --git a/src/Benchmark/main.cpp b/src/Benchmark/main.cpp new file mode 100644 index 00000000..eb0427bb --- /dev/null +++ b/src/Benchmark/main.cpp @@ -0,0 +1,10 @@ +/* + * main.cpp + * + * Created on: Nov 19, 2015 + * Author: ebke + */ + +#include + +BENCHMARK_MAIN(); diff --git a/src/OpenMesh/Core/Geometry/VectorT.hh b/src/OpenMesh/Core/Geometry/VectorT.hh index a582d194..5e2aca6f 100644 --- a/src/OpenMesh/Core/Geometry/VectorT.hh +++ b/src/OpenMesh/Core/Geometry/VectorT.hh @@ -60,7 +60,7 @@ // macro expansion and preprocessor defines // don't work properly. -#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) +#if (__cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) #include "Vector11T.hh" #else #ifndef DOXYGEN diff --git a/src/OpenMesh/Core/Geometry/VectorT_inc.hh b/src/OpenMesh/Core/Geometry/VectorT_inc.hh index 97bc055f..96b6c100 100644 --- a/src/OpenMesh/Core/Geometry/VectorT_inc.hh +++ b/src/OpenMesh/Core/Geometry/VectorT_inc.hh @@ -97,28 +97,6 @@ public: /// default constructor creates uninitialized values. inline VectorT() {} -#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) - explicit inline VectorT(const Scalar &v) { - vectorize(v); - } - - template::type, - typename = typename std::enable_if::value>::type> - constexpr VectorT(T... vs) : Base { static_cast(vs)...} - { } - - template::type> - typename std::enable_if::type - homogenized() const { - return VectorT( - Base::values_[0]/Base::values_[3], - Base::values_[1]/Base::values_[3], - Base::values_[2]/Base::values_[3], - 1); - } - -#else /// special constructor for 1D vectors explicit inline VectorT(const Scalar& v) { // assert(DIM==1); @@ -165,7 +143,6 @@ public: Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5; } -#endif #endif /// construct from a value array (explicit) @@ -210,21 +187,11 @@ public: // /// cast to const Scalar array // inline operator const Scalar*() const { return Base::values_; } -#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) - /// access to Scalar array - inline Scalar* data() { return Base::values_.data(); } - - /// access to const Scalar array - inline const Scalar*data() const { return Base::values_.data(); } -#else /// access to Scalar array inline Scalar* data() { return Base::values_; } /// access to const Scalar array inline const Scalar*data() const { return Base::values_; } -#endif - - //----------------------------------------------------------- element access