mirror of
https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
synced 2024-12-01 18:34:34 +00:00
108 lines
3.0 KiB
C++
108 lines
3.0 KiB
C++
/*
|
|
* 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_
|