時間計測関数
時間計測用の関数(クラス)をメモします。
使いたいときに使えるように。。
使いたいときに使えるように。。
簡単に作れるんだけど、一から考えるのは結構面倒なので、次使えるように準備しておきます。
startとstopと経過時間(elapsedTime)
時間計測用クラスTimer
- start()関数を呼び、その時間を保持
- stop()関数を呼び、その時間を保持
- getElapsedTime*関数にて、その差分の時間を表示
API | 説明 |
void start(); | 時間計測を開始する |
void stop(); | 時間計測を終了する |
double getElapsedTime(); | 経過時間を表示(秒) |
double getElapsedTimeInSec(); | 経過時間を表示(秒)、getElapsedTimeと同じ |
double getElapsedTimeInMilliSec(); | 経過時間を表示(ミリ秒) |
double getElapsedTimeInMicroSec(); | 経過時間を表示(マイクロ秒) |
Timer.h
#ifndef __TIEMR_H_
#define __TIEMR_H_
#ifdef WIN32 // Windows system specific
#include <windows.h>
#else // Unix based system specific
#include <sys/time.h>
#endif
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////////////
// --- usage ----
//
// Tiemr t;
// t.start();
//
// ... proc ...
//
// t.stop();
// std::cout << "ElapsedTime = " << t.getElapsedTimeInSec() << " [s]" << std::endl;
// std::cout << "ElapsedTime = " << t.getElapsedTimeInMilliSec() << " [ms]" << std::endl;
// std::cout << "ElapsedTime = " << t.getElapsedTimeInMicroSec() << " [us]" << std::endl;
//
//
////////////////////////////////////////////////////////////////////////////////
class Timer
{
public:
//
// constructor
//
Timer() {
#ifdef WIN32
QueryPerformanceFrequency(&frequency);
startCount.QuadPart = 0;
endCount.QuadPart = 0;
#else
startCount.tv_sec = startCount.tv_usec = 0;
endCount.tv_sec = endCount.tv_usec = 0;
#endif
stopped = 0;
startTimeInMicroSec = 0;
endTimeInMicroSec = 0;
}
//
// destructor
//
~Timer() {
}
//
// start timer.
//
void start() {
stopped = 0; // reset stop flag
#ifdef WIN32
QueryPerformanceCounter(&startCount);
#else
gettimeofday(&startCount, NULL);
#endif
}
//
// stop the timer.
//
void stop() {
stopped = 1; // set timer stopped flag
#ifdef WIN32
QueryPerformanceCounter(&endCount);
#else
gettimeofday(&endCount, NULL);
#endif
}
//
// compute elapsed time in micro-second resolution.
//
double getElapsedTimeInMicroSec() {
#ifdef WIN32
if(!stopped) QueryPerformanceCounter(&endCount);
startTimeInMicroSec = startCount.QuadPart * (1000000.0 / frequency.QuadPart);
endTimeInMicroSec = endCount.QuadPart * (1000000.0 / frequency.QuadPart);
#else
if(!stopped) gettimeofday(&endCount, NULL);
startTimeInMicroSec = (startCount.tv_sec * 1000000.0) + startCount.tv_usec;
endTimeInMicroSec = (endCount.tv_sec * 1000000.0) + endCount.tv_usec;
#endif
return endTimeInMicroSec - startTimeInMicroSec;
}
//
// divide elapsedTimeInMicroSec by 1000
//
double getElapsedTimeInMilliSec() {
return this->getElapsedTimeInMicroSec() * 0.001;
}
//
// divide elapsedTimeInMicroSec by 1000000
//
double getElapsedTimeInSec() {
return this->getElapsedTimeInMicroSec() * 0.000001;
}
//
// same as getElapsedTimeInSec()
//
double getElapsedTime() {
return this->getElapsedTimeInSec();
}
private:
double startTimeInMicroSec;
double endTimeInMicroSec;
int stopped;
#ifdef WIN32
LARGE_INTEGER frequency;
LARGE_INTEGER startCount;
LARGE_INTEGER endCount;
#else
timeval startCount;
timeval endCount;
#endif
};
#endif // __TIEMR_H_
使い方
- main.cpp
#include "Timer.h"
#include <iostream>
int main(int argc, char* argv[])
{
Timer t;
t.start();
for (int i=0; i<10000; ++i) {
for (int j=0; j<100000; ++j) {
;
}
}
t.stop();
std::cout << "ElapsedTime = " << t.getElapsedTimeInSec() << " [s]" << std::endl;
std::cout << "ElapsedTime = " << t.getElapsedTimeInMilliSec() << " [ms]" << std::endl;
std::cout << "ElapsedTime = " << t.getElapsedTimeInMicroSec() << " [us]" << std::endl;
return 0;
}
- 結果
ElapsedTime = 2.8441 [s] ElapsedTime = 2844.1 [ms] ElapsedTime = 2.8441e+06 [us]
FPS(フレームレート)計測
1秒間にupdateを呼んだ回数(フレーム)を測定する。
クラス名:FpsTimer
API | 説明 |
bool update(double value=1.0) | フレームレートを更新、フレームレート更新時にも度地理にtrueを返す |
double getFramerate() | フレームレートを取得する |
FpsCounter.h
#ifndef __FPS_COUNTER_H_
#define __FPS_COUNTER_H_
#ifdef WIN32 // Windows system specific
#include <windows.h>
#else // Unix based system specific
#include <sys/time.h>
#endif
#include <stdlib.h>
class FpsCounter
{
public:
FpsCounter() {
#ifdef WIN32
QueryPerformanceFrequency(&frequency);
lastCount.QuadPart = 0;
#else
lastCount.tv_sec = lastCount.tv_usec = 0;
#endif
frame_rate = 0.0;
frame_count = 0;
}
~FpsCounter() {
}
bool update(double value=1.0) {
bool result = false;
double delta;
#ifdef WIN32
QueryPerformanceCounter(¤tCount);
delta = (currentCount.QuadPart * (1.0 / frequency.QuadPart))
- (lastCount.QuadPart * (1.0 / frequency.QuadPart));
#else
gettimeofday(¤tCount, NULL);
delta = ((currentCount.tv_sec * 1.0) + currentCount.tv_usec*0.000001)
- ((lastCount.tv_sec * 1.0) + lastCount.tv_usec*0.000001);
#endif
if (delta >= value) {
frame_rate = (double)frame_count / delta;
frame_count = 0;
lastCount = currentCount;
result = true;
}
++frame_count;
return result;
}
double getFramerate() {
return frame_rate;
}
private:
int frame_count;
double frame_rate;
#ifdef WIN32
LARGE_INTEGER frequency;
LARGE_INTEGER lastCount;
LARGE_INTEGER currentCount;
#else
timeval lastCount;
timeval currentCount;
#endif
};
#endif // __FPS_COUNTER_H_
テスト
- test.cpp
#include "FpsCounter.h"
#include <iostream>
int main(int argc, char* argv[])
{
FpsCounter fps;
Timer t;
t.start();
for (int i=0; i<10000; ++i) {
for (int j=0; j<30; ++j) {
fps.update();
usleep(17000);
}
std::cout << "FrameRate = " << fps.getFramerate() << " FPS" << std::endl;
}
return 0;
}
- 結果
FrameRate = 0 FPS FrameRate = 58.625 FPS FrameRate = 58.625 FPS FrameRate = 58.6254 FPS FrameRate = 58.6254 FPS FrameRate = 58.6305 FPS FrameRate = 58.6305 FPS