|
Packit |
1fb8d4 |
/* measure.h
|
|
Packit |
1fb8d4 |
* Macros to help with performance measurement.
|
|
Packit |
1fb8d4 |
* vi:ts=4 sw=4
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* (c) Copyright 2012 Hewlett-Packard Development Company, L.P.
|
|
Packit |
1fb8d4 |
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
Packit |
1fb8d4 |
* not use this file except in compliance with the License. You may obtain
|
|
Packit |
1fb8d4 |
* a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
Packit |
1fb8d4 |
* Unless required by applicable law or agreed to in writing, software
|
|
Packit |
1fb8d4 |
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit |
1fb8d4 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
Packit |
1fb8d4 |
* or implied. See the License for the specific language governing
|
|
Packit |
1fb8d4 |
* permissions and limitations under the License. Algorithms used by
|
|
Packit |
1fb8d4 |
* this code may be covered by patents by HP, Microsoft, or other parties.
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* MEASURE_LOOP_START("measurement", 2000)
|
|
Packit |
1fb8d4 |
* code to be measured
|
|
Packit |
1fb8d4 |
* MEASURE_LOOP_STOP
|
|
Packit |
1fb8d4 |
* buffer flush and such
|
|
Packit |
1fb8d4 |
* MEASURE_SHOW_RESULTS
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* Define GOOGLE_PROFILER if you want gperftools included.
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef TEST_MEASURE_H_INCLUDED
|
|
Packit |
1fb8d4 |
#define TEST_MEASURE_H_INCLUDED
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
1fb8d4 |
#include "config.h"
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <time.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef _WIN32
|
|
Packit |
1fb8d4 |
#include <sys/param.h>
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <winpr/crt.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef _WIN32
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define PROFILER_START(_prefix_)
|
|
Packit |
1fb8d4 |
#define PROFILER_STOP
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MEASURE_LOOP_START(_prefix_, _count_)
|
|
Packit |
1fb8d4 |
#define MEASURE_LOOP_STOP
|
|
Packit |
1fb8d4 |
#define MEASURE_GET_RESULTS(_result_)
|
|
Packit |
1fb8d4 |
#define MEASURE_SHOW_RESULTS(_result_)
|
|
Packit |
1fb8d4 |
#define MEASURE_SHOW_RESULTS_SCALED(_scale_, _label_)
|
|
Packit |
1fb8d4 |
#define MEASURE_TIMED(_label_, _init_iter_, _test_time_, _result_, _call_)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef GOOGLE_PROFILER
|
|
Packit |
1fb8d4 |
#include <gperftools/profiler.h>
|
|
Packit |
1fb8d4 |
#define PROFILER_START(_prefix_) \
|
|
Packit |
1fb8d4 |
do { \
|
|
Packit |
1fb8d4 |
char _path[PATH_MAX]; \
|
|
Packit |
1fb8d4 |
sprintf_s(_path, sizeof(_path), "./%s.prof", (_prefix_)); \
|
|
Packit |
1fb8d4 |
ProfilerStart(_path); \
|
|
Packit |
1fb8d4 |
} while (0);
|
|
Packit |
1fb8d4 |
# define PROFILER_STOP \
|
|
Packit |
1fb8d4 |
do { \
|
|
Packit |
1fb8d4 |
ProfilerStop(); \
|
|
Packit |
1fb8d4 |
} while (0);
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
#define PROFILER_START(_prefix_)
|
|
Packit |
1fb8d4 |
#define PROFILER_STOP
|
|
Packit |
1fb8d4 |
#endif // GOOGLE_PROFILER
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
extern float _delta_time(const struct timespec* t0, const struct timespec* t1);
|
|
Packit |
1fb8d4 |
extern void _floatprint(float t, char* output);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef CLOCK_MONOTONIC_RAW
|
|
Packit |
1fb8d4 |
#define CLOCK_MONOTONIC_RAW 4
|
|
Packit |
1fb8d4 |
#endif // !CLOCK_MONOTONIC_RAW
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MEASURE_LOOP_START(_prefix_, _count_) \
|
|
Packit |
1fb8d4 |
{ struct timespec _start, _stop; \
|
|
Packit |
1fb8d4 |
char *_prefix; \
|
|
Packit |
1fb8d4 |
int _count = (_count_); \
|
|
Packit |
1fb8d4 |
int _loop; \
|
|
Packit |
1fb8d4 |
float _delta; \
|
|
Packit |
1fb8d4 |
char _str1[32], _str2[32]; \
|
|
Packit |
1fb8d4 |
_prefix = strdup(_prefix_); \
|
|
Packit |
1fb8d4 |
_str1[0] = '\0'; _str2[0] = '\0'; \
|
|
Packit |
1fb8d4 |
clock_gettime(CLOCK_MONOTONIC_RAW, &_start); \
|
|
Packit |
1fb8d4 |
PROFILER_START(_prefix); \
|
|
Packit |
1fb8d4 |
_loop = (_count); \
|
|
Packit |
1fb8d4 |
do {
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MEASURE_LOOP_STOP \
|
|
Packit |
1fb8d4 |
} while (--_loop);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MEASURE_GET_RESULTS(_result_) \
|
|
Packit |
1fb8d4 |
PROFILER_STOP; \
|
|
Packit |
1fb8d4 |
clock_gettime(CLOCK_MONOTONIC_RAW, &_stop); \
|
|
Packit |
1fb8d4 |
_delta = _delta_time(&_start, &_stop); \
|
|
Packit |
1fb8d4 |
(_result_) = (float) _count / _delta; \
|
|
Packit |
1fb8d4 |
free(_prefix); \
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MEASURE_SHOW_RESULTS(_result_) \
|
|
Packit |
1fb8d4 |
PROFILER_STOP; \
|
|
Packit |
1fb8d4 |
clock_gettime(CLOCK_MONOTONIC_RAW, &_stop); \
|
|
Packit |
1fb8d4 |
_delta = _delta_time(&_start, &_stop); \
|
|
Packit |
1fb8d4 |
(_result_) = (float) _count / _delta; \
|
|
Packit |
1fb8d4 |
_floatprint((float) _count / _delta, _str1); \
|
|
Packit |
1fb8d4 |
printf("%s: %9d iterations in %5.1f seconds = %s/s \n", \
|
|
Packit |
1fb8d4 |
_prefix, _count, _delta, _str1); \
|
|
Packit |
1fb8d4 |
free(_prefix); \
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MEASURE_SHOW_RESULTS_SCALED(_scale_, _label_) \
|
|
Packit |
1fb8d4 |
PROFILER_STOP; \
|
|
Packit |
1fb8d4 |
clock_gettime(CLOCK_MONOTONIC_RAW, &_stop); \
|
|
Packit |
1fb8d4 |
_delta = _delta_time(&_start, &_stop); \
|
|
Packit |
1fb8d4 |
_floatprint((float) _count / _delta, _str1); \
|
|
Packit |
1fb8d4 |
_floatprint((float) _count / _delta * (_scale_), _str2); \
|
|
Packit |
1fb8d4 |
printf("%s: %9d iterations in %5.1f seconds = %s/s = %s%s \n", \
|
|
Packit |
1fb8d4 |
_prefix, _count, _delta, _str1, _str2, _label_); \
|
|
Packit |
1fb8d4 |
free(_prefix); \
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define MEASURE_TIMED(_label_, _init_iter_, _test_time_, _result_, _call_) \
|
|
Packit |
1fb8d4 |
{ float _r; \
|
|
Packit |
1fb8d4 |
MEASURE_LOOP_START(_label_, _init_iter_); \
|
|
Packit |
1fb8d4 |
_call_; \
|
|
Packit |
1fb8d4 |
MEASURE_LOOP_STOP; \
|
|
Packit |
1fb8d4 |
MEASURE_GET_RESULTS(_r); \
|
|
Packit |
1fb8d4 |
MEASURE_LOOP_START(_label_, _r * _test_time_); \
|
|
Packit |
1fb8d4 |
_call_; \
|
|
Packit |
1fb8d4 |
MEASURE_LOOP_STOP; \
|
|
Packit |
1fb8d4 |
MEASURE_SHOW_RESULTS(_result_); \
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif // __MEASURE_H_INCLUDED__
|