add benchmarks for non-fundamental Scalar types for VectorT

This commit is contained in:
Janis Born
2015-11-23 11:38:33 +01:00
parent 8ce8d00bf3
commit 797e83f2c0
4 changed files with 78 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ list (APPEND SOURCES
main.cpp
VectorT_new.cpp
VectorT_legacy.cpp
VectorT_dummy_data.cpp
)
add_executable(OMBenchmark ${SOURCES})

View File

@@ -129,3 +129,35 @@ MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec3d);
MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec3f);
MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec4d);
MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec4f);
#include "VectorT_dummy_data.hpp"
template<class Vec>
static void ASSEMBLE(BMPOSTFIX, Vec_add_in_place)(benchmark::State& state) {
auto v = make_dummy_vector<Vec>();
while (state.KeepRunning()) {
v += v;
}
// Otherwise GCC will optimize everything away.
static double dummy = observe_dummy_vector(v);
static_cast<void>(dummy);
}
template<class Vec>
static void ASSEMBLE(BMPOSTFIX, Vec_add_temporary)(benchmark::State& state) {
auto v = make_dummy_vector<Vec>();
while (state.KeepRunning()) {
v = v + v;
}
// Otherwise GCC will optimize everything away.
static double dummy = observe_dummy_vector(v);
static_cast<void>(dummy);
}
typedef OpenMesh::VectorT<std::valarray<double>, 3> Vec3VAd;
typedef OpenMesh::VectorT<std::complex<double>, 3> Vec3Cd;
MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_in_place), Vec3VAd);
MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_temporary), Vec3VAd);
MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_in_place), Vec3Cd);
MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_temporary), Vec3Cd);

View File

@@ -0,0 +1,5 @@
#include "VectorT_dummy_data.hpp"
template<> std::valarray<double> make_dummy_component() {
return std::valarray<double>(128);
}

View File

@@ -0,0 +1,40 @@
#pragma once
#include <valarray>
#include <complex>
template<typename T>
T make_dummy_component() {
return T();
}
template<> std::valarray<double> make_dummy_component();
template<typename Vec>
Vec make_dummy_vector() {
return Vec(make_dummy_component<typename Vec::value_type>());
}
template<typename Scalar>
double observe_dummy_component(const Scalar& _s) {
return _s;
}
template<typename T>
double observe_dummy_component(const std::valarray<T>& _s) {
return _s.sum();
}
template<typename T>
double observe_dummy_component(const std::complex<T>& _s) {
return _s.real() + _s.imag();
}
template<typename Vec>
double observe_dummy_vector(const Vec& _vec) {
double result = 0.0;
for (int dim = 0; dim < _vec.dim(); ++dim) {
result += observe_dummy_component(_vec[dim]);
}
return result;
}