7#ifndef __MICRO_BENCHMARK_NS_IMPL_H__
8#define __MICRO_BENCHMARK_NS_IMPL_H__
14#define PHOENIX_MINIMUM_TIME_NS 1000000000.0
21 asm volatile(
"" : :
"r,m"(value) :
"memory");
30 asm volatile(
"" :
"+r,m"(value) : :
"memory");
32 asm volatile(
"" :
"+m,r"(value) : :
"memory");
44template<
typename _Callable,
typename... _Args>
45void micro_benchmarkNs(
double & ellapsedTimeNs,
double & ellapsedTimeErrorNs,
size_t nbTestPerf,
size_t nbCallPerTest,
46 _Callable&& __f, _Args&&... __args)
51 for(
size_t i(0lu); i < nbTestPerf; ++i){
54 for(
size_t j(0lu); j < nbCallPerTest; ++j){
60 double fullNs(elapsedTime.count()/((
double)nbCallPerTest));
61 vecTimeNs.push_back(fullNs);
65 size_t nbValueUsed(vecTimeNs.size()*0.7 + 1lu);
66 if(nbValueUsed > vecTimeNs.size()){
67 nbValueUsed = vecTimeNs.size();
80template<
typename _Callable,
typename... _Args>
81void micro_benchmarkAutoNs(
double & ellapsedTimeNs,
double & ellapsedTimeErrorNs, _Callable&& __f, _Args&&... __args){
82 size_t nbTestPerf(100lu), nbCallPerTest(10lu);
84 micro_benchmarkNs(ellapsedTimeNs, ellapsedTimeErrorNs, nbTestPerf, nbCallPerTest, __f, __args...);
91 double fullEllapsedTime(ellapsedTimeNs*((
double)nbTestPerf)*((
double)nbCallPerTest));
104 nbCallPerTest *= ratioTime;
107 micro_benchmarkNs(ellapsedTimeNs, ellapsedTimeErrorNs, nbTestPerf, nbCallPerTest, __f, __args...);
108 fullEllapsedTime = ellapsedTimeNs*((double)nbTestPerf)*((
double)nbCallPerTest);
111 std::cout <<
"micro_benchmarkAutoNs : nbCallPerTest = " << nbCallPerTest << std::endl;
112 if(nbCallPerTest > 1000000000lu || nbCallPerTest == 0lu){
113 std::cout <<
"micro_benchmarkAutoNs : Warning invalid number of calls per test should lead to unrelevant results!!!" << std::endl;
128template<
typename _Callable,
typename... _Args>
130 double & timePerElement,
double & timeErrorPerElement,
size_t nbTestPerf,
size_t nbCallPerTest,
size_t nbElement,
131 _Callable&& __f, _Args&&... __args)
133 micro_benchmarkNs(ellapsedTimeNs, ellapsedTimeErrorNs, nbTestPerf, nbCallPerTest, __f, __args...);
134 timePerElement = ellapsedTimeNs/((double)nbElement);
135 timeErrorPerElement = ellapsedTimeErrorNs/((double)nbElement);
147template<
typename _Callable,
typename... _Args>
149 double & timePerElement,
double & timeErrorPerElement,
size_t nbElement,
150 _Callable&& __f, _Args&&... __args)
153 timePerElement = ellapsedTimeNs/((double)nbElement);
154 timeErrorPerElement = ellapsedTimeErrorNs/((double)nbElement);
165template<
typename _Callable,
typename... _Args>
166void micro_benchmarkNsPrint(
const std::string & testName,
size_t nbTestPerf,
size_t nbCallPerTest,
size_t nbElement, _Callable&& __f, _Args&&... __args){
167 double ellapsedTimeNs(0.0), ellapsedTimeErrorNs(0.0), timePerElement(0.0), timeErrorPerElement(0.0);
168 micro_benchmarkNs(ellapsedTimeNs, ellapsedTimeErrorNs, timePerElement, timeErrorPerElement, nbTestPerf, nbCallPerTest, nbElement, __f, __args...);
170 std::cout << testName <<
" : nbElement = "<<nbElement<<
", timePerElement = " << timePerElement <<
" ns/el ± "<<timeErrorPerElement<<
", elapsedTime = " << ellapsedTimeNs <<
" ns ± "<<ellapsedTimeErrorNs << std::endl;
171 std::cerr << nbElement <<
"\t" << timePerElement <<
"\t" << ellapsedTimeNs <<
"\t" << timeErrorPerElement <<
"\t" << ellapsedTimeErrorNs << std::endl;
180template<
typename _Callable,
typename... _Args>
182 double ellapsedTimeNs(0.0), ellapsedTimeErrorNs(0.0), timePerElement(0.0), timeErrorPerElement(0.0);
183 micro_benchmarkAutoNs(ellapsedTimeNs, ellapsedTimeErrorNs, timePerElement, timeErrorPerElement, nbElement, __f, __args...);
185 std::cout << testName <<
" : nbElement = "<<nbElement<<
", timePerElement = " << timePerElement <<
" ns/el ± "<<timeErrorPerElement<<
", elapsedTime = " << ellapsedTimeNs <<
" ns ± "<<ellapsedTimeErrorNs << std::endl;
186 std::cerr << nbElement <<
"\t" << timePerElement <<
"\t" << ellapsedTimeNs <<
"\t" << timeErrorPerElement <<
"\t" << ellapsedTimeErrorNs << std::endl;
void micro_benchmarkVecToMap(MapOrderedTime &mapOrderTime, const VecEllapsedTime &vecTime)
Fill the map of ordered time with the vector.
void micro_benchmarkComputeTime(double &ellapsedTimeNs, double &ellapsedTimeErrorNs, const MapOrderedTime &mapOrderTime, size_t nbValueToBeUsed)
Compute the total computing time and associated error with the given data.
std::map< double, size_t > MapOrderedTime
Map of the ordered ellapsed time.
std::vector< double > VecEllapsedTime
Vector of ellapsed time measurement.
HiPeTime phoenix_getTime()
Get the current time.
std::chrono::nanoseconds NanoSecs
std::chrono::time_point< std::chrono::steady_clock > HiPeTime
void micro_benchmarkNsPrint(const std::string &testName, size_t nbTestPerf, size_t nbCallPerTest, size_t nbElement, _Callable &&__f, _Args &&... __args)
Do the micro benchmarking of a given function and gives performance results in ns and print the resul...
void micro_benchmarkAutoNs(double &ellapsedTimeNs, double &ellapsedTimeErrorNs, _Callable &&__f, _Args &&... __args)
Do the micro benchmarking of a given function and gives performance results in ns.
#define PHOENIX_MINIMUM_TIME_NS
Minimum time for performance test in ns.
void micro_benchmarkNs(double &ellapsedTimeNs, double &ellapsedTimeErrorNs, size_t nbTestPerf, size_t nbCallPerTest, _Callable &&__f, _Args &&... __args)
Do the micro benchmarking of a given function and gives performance results in ns.
void phoenix_doNotOptimize(T const &value)
Prevent compiler from optimising a loop.
void micro_benchmarkAutoNsPrint(const std::string &testName, size_t nbElement, _Callable &&__f, _Args &&... __args)
Do the micro benchmarking of a given function and gives performance results in ns and print the resul...