blob: bb6dd80ec5743a03a13a8d703588cd10650e3e7d [file] [log] [blame]
/*
* Copyright 2014 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MATHFU_BENCHMARKS_BENCHMARKCOMMON_H_
#define MATHFU_BENCHMARKS_BENCHMARKCOMMON_H_
#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
#include <sys/time.h>
#include <time.h>
#endif // defined(_WIN32)
// This macro stands in for a double loop over a vector with size elements.
// This double loop is repeated iterations times to create more accurate
// performance test.
#define PERFTEST_2D_VECTOR_LOOP(iterations, size) \
for (unsigned int k = 0; k < iterations; k++) \
for (unsigned int i = 0; i < size; i++) \
for (unsigned int j = 0; j < size; j++)
// High resolution timer.
class Timer {
public:
Timer() {
InitializeTickPeriod();
Reset();
}
// Save the current number of counter ticks.
void Reset() {
start_ = GetTicks();
}
// Get the time elapsed in counter ticks since Reset() was called.
unsigned long long GetElapsedTicks() {
return GetTicks() - start_;
}
// Get the time elapsed in seconds since Reset() was called.
double GetElapsedSeconds() {
return static_cast<double>(GetElapsedTicks()) * tick_period();
}
public:
// Initialize the tick period value.
static void InitializeTickPeriod() {
if (tick_period_ != 0) {
return;
}
#if defined(_WIN32)
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);
tick_period_ = 1.0 / static_cast<double>(frequency.QuadPart);
#elif defined(__linux__)
// Use a fixed frequency of 1ns to match timespec.
tick_period_ = 1e-9;
#else
// Use a fixed frequency of 1us to match timeval.
tick_period_ = 1e-6;
#endif // defined(_WIN32)
}
// Get the period of one counter tick.
static double tick_period() {
return tick_period_;
}
// Get the number of counter ticks elapsed.
static unsigned long long GetTicks() {
#if defined(_WIN32)
LARGE_INTEGER ticks;
QueryPerformanceCounter(&ticks);
return ticks.QuadPart;
#elif defined(__linux__)
struct timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
return (static_cast<unsigned long long>(time.tv_sec) * 1000000000ULL) +
time.tv_nsec;
#else
struct timeval time;
gettimeofday(&time, NULL);
return (static_cast<unsigned long long>(time.tv_sec) * 1000000ULL) +
time.tv_usec;
#endif
}
private:
unsigned long long start_;
static double tick_period_;
};
double Timer::tick_period_ = 0;
#endif // MATHFU_BENCHMARKS_BENCHMARKCOMMON_H_