bambooflow Note

時間計測関数

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

時間計測関数


時間計測用の関数(クラス)をメモします。
使いたいときに使えるように。。

簡単に作れるんだけど、一から考えるのは結構面倒なので、次使えるように準備しておきます。



startとstopと経過時間(elapsedTime)


時間計測用クラスTimer

  1. start()関数を呼び、その時間を保持
  2. stop()関数を呼び、その時間を保持
  3. 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(&currentCount);
        delta = (currentCount.QuadPart * (1.0 / frequency.QuadPart))
                 - (lastCount.QuadPart * (1.0 / frequency.QuadPart));
#else
        gettimeofday(&currentCount, 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
記事メニュー
ウィキ募集バナー