В этом посте я решил опубликовать класс для подсчета времени, написанный на C++. Он был взят где-то на просторах интернета пару лет назад. Я таскал его с собой из лабораторной в лабораторную. Везде, где нужно было замерить временной интервал той или иной операции, я использовал его. Естественно, я выкладываю не «первозданный» вариант, а немного дополненный мной для своих нужд. Надеюсь, он будет полезен кому-нибудь еще кроме меня.
Мне кажется, что для использования в лабораторных под Windows, этот таймер подходит очень хорошо. Единственное, мне кажется, что игра с приоритетами выполнения тут ни к чему. Но удалять я её не стал, ибо не мешает :) Помимо всего прочего, класс считает время с точностью до миллисекунд. Большее, опять таки, лишено смысла, ибо тогда получается огромная погрешность.
Возможно, чуть позже выложу доработанный, более «красивый» вариант. Хотя, два года меня вполне устраивал и этот.
Вот он.
Файл TimeCounter.h:
#ifndef __TIMECOUNTER222__H__
#define __TIMECOUNTER222__H__
#include <iostream>
//////////////////////////////////////////
/// Допустимые значения приоритета потока:
/// THREAD_PRIORITY_HIGHEST
/// THREAD_PRIORITY_ABOVE_NORMAL
/// THREAD_PRIORITY_NORMAL
/// THREAD_PRIORITY_BELOW_NORMAL
/// THREAD_PRIORITY_LOWEST
//////////////////////////////////////////
class TimeCounter
{
friend std::ostream& operator<<(std::ostream& out, TimeCounter& cntr);
public:
TimeCounter() {started=false; stopped=false; tWord = 0;}
void Start();
void Start(int nPriority);
void Stop();
double timeElapsed() const;
bool getStarted() const {return started;}
bool getStopped() const {return stopped;}
int getNewPriority() const {return new_priority;}
~TimeCounter();
void Assign(TimeCounter &cntr);
void Add(TimeCounter &cntr);
void Clear();
protected:
int new_priority;
int old_priority;
bool started;
bool stopped;
double tBefore, tAfter, i64PerfFrequency;
double tWord;
};
#endif
Файл TimeCounter.cpp:
#include "TimeCounter.h"
#include <windows.h>
//старт счетчика
void TimeCounter::Start()
{
started=true;
stopped=false;
new_priority=0;
LARGE_INTEGER pf;
QueryPerformanceFrequency(&pf);
i64PerfFrequency = pf.QuadPart;
Sleep(0);
QueryPerformanceCounter(&pf);
tBefore = pf.QuadPart;
tWord = 0;
}
void TimeCounter::Start(int nPriority)
{
started=true;
stopped=false;
new_priority=nPriority;
old_priority=GetThreadPriority(GetCurrentThread());
SetThreadPriority(GetCurrentThread(),new_priority);
LARGE_INTEGER pf;
QueryPerformanceFrequency(&pf);
i64PerfFrequency = pf.QuadPart;
Sleep(0);
QueryPerformanceCounter(&pf);
tBefore = pf.QuadPart;
}
//остановка таймера
void TimeCounter::Stop()
{
LARGE_INTEGER tAfter1;
QueryPerformanceCounter(&tAfter1);
tAfter = tAfter1.QuadPart;
tWord = tAfter - tBefore;
tWord /= i64PerfFrequency;
if (new_priority)
SetThreadPriority(GetCurrentThread(),old_priority);
started=false;
stopped=true;
}
double TimeCounter::timeElapsed() const
{
LARGE_INTEGER tempAfter;
double tempWord;
if (started)
{
QueryPerformanceCounter(&tempAfter);
tempWord = tempAfter.QuadPart - tBefore;
tempWord /= i64PerfFrequency;
return tempWord;
}
if (stopped)
return tWord;
return 0.;
}
TimeCounter::~TimeCounter()
{
if (new_priority)
SetThreadPriority(GetCurrentThread(),old_priority);
}
//вывод в поток
std::ostream& operator<<(std::ostream& out, TimeCounter& cntr)
{
double fsec = cntr.timeElapsed();
int hour = int(fsec/3600.);
double fmin = fsec-3600.*double(hour);
int min = int(fmin/60.);
double sec = fmin-60.*double(min);
out<new_priority = cntr.new_priority;
this->old_priority = cntr.old_priority;
this->started = cntr.started;
this->stopped = cntr.stopped;
this->tBefore = cntr.tBefore;
this->tAfter = cntr.tAfter;
this->i64PerfFrequency = cntr.i64PerfFrequency;
this->tWord = cntr.tWord;
}
//сложение значений двух таймеров
void TimeCounter::Add(TimeCounter& cntr)
{
this->tWord += cntr.tWord;
}
//обнуление таймера
void TimeCounter::Clear()
{
this->tWord = 0;
}
Использовать его очень просто:
TimeCounter t;
t.Start();
t.Stop();
cout<<t;
Полезная статья? Их будет больше, если вы поддержите меня!