Blame libfreerdp/primitives/test/measure.h

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