В этом посте я решил опубликовать класс для подсчета времени, написанный на C++. Он был взят где-то на просторах интернета пару лет назад. Я таскал его с собой из лабораторной в лабораторную. Везде, где нужно было замерить временной интервал той или иной операции, я использовал его. Естественно, я выкладываю не «первозданный» вариант, а немного дополненный мной для своих нужд. Надеюсь, он будет полезен кому-нибудь еще кроме меня.
Мне кажется, что для использования в лабораторных под Windows, этот таймер подходит очень хорошо. Единственное, мне кажется, что игра с приоритетами выполнения тут ни к чему. Но удалять я её не стал, ибо не мешает :) Помимо всего прочего, класс считает время с точностью до миллисекунд. Большее, опять таки, лишено смысла, ибо тогда получается огромная погрешность.
Возможно, чуть позже выложу доработанный, более «красивый» вариант. Хотя, два года меня вполне устраивал и этот.
Вот он.
Файл TimeCounter.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
#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; } |
Использовать его очень просто:
1 2 3 4 |
TimeCounter t; t.Start(); t.Stop(); cout<<t; |
Полезная статья? Их будет больше, если вы поддержите меня!