Обёртка над QPC (комментарии)
Это сообщение сгенерировано автоматически.
Может стоит добавить получение миллисекунд?
целый класс для этого совсем не нужен
Я бы для замера скорости выполнения участков кода всё же rdtsc использовал. Плюс привязку потока к процессору.
Пару дней назад долго парился над точным таймером для Linux, вот что получил в результате, оставлю тут, может кому понадобится:
#include <ctime> namespace timer{ timespec Time; timespec Start; void Reset(){ clock_gettime( CLOCK_REALTIME,&Start); } } double Clock( ){ clock_gettime( CLOCK_REALTIME,&timer::Time); return static_cast<double>( ( timer::Time.tv_sec-timer::Start.tv_sec)+( timer::Time.tv_nsec-timer::Start.tv_nsec)/1000000000.0); }
>> Мизраэль Постоялец
>> Я бы для замера скорости выполнения участков кода всё же rdtsc использовал. Плюс привязку потока к процессору.
Скорее всего QueryPerformanceFrequency "внутри" использует rdtsc.
я себе такой таймер накидал:
#ifndef Timer_h__ #define Timer_h__ #define TIMER_QPC #ifndef TIMER_QPC #define TIMER_TGT #endif namespace Video { class Timer { private: #ifdef TIMER_TGT static int refCount = 0; DWORD lastTime, curTime, diff; #else __int64 lastTime, curTime, diff, perfFreq; #endif float timeElapsed; public: Timer() :timeElapsed( 0) { #ifdef TIMER_TGT if( refCount == 0) timeBeginPeriod( 1); refCount++; #else QueryPerformanceFrequency( ( LARGE_INTEGER *)&perfFreq); #endif } ~Timer( ) { #ifdef TIMER_TGT refCount--; if( refCount == 0) timeEndPeriod( 1); #endif } void Start( ) { #ifdef TIMER_TGT lastTime = timeGetTime( ); #else QueryPerformanceCounter( ( LARGE_INTEGER *)&lastTime); #endif } void Stop( ) { #ifdef TIMER_TGT curTime = timeGetTime( ); diff = curTime - lastTime; timeElapsed = 1.0d / ( double)diff; //time in SECONDS #else QueryPerformanceCounter( ( LARGE_INTEGER *)&curTime); if( lastTime == 0) timeElapsed = 0; else { timeElapsed = ( float)( ( double)( curTime - lastTime) / ( double)perfFreq); } #endif } float getTimeElapsed( ) { return timeElapsed; } }; } #endif // Timer_h__
ElWray
> Скорее всего QueryPerformanceFrequency "внутри" использует rdtsc.
Скорее всего http://en.wikipedia.org/wiki/High_Precision_Event_Timer но вообще любой высокочастотный таймер (даже GetTickCount, если ничего лучше нет)
http://www.devdoc.ru/index.php/content/view/queryPerformanceCounter.htm
Должно быть, я что-то не понимаю тут.
Там же написано, что проблемы из-за багов некоторых чипсетов (говорят, AMD славилась этим и для них был какой-то патч).
NULL_PTR
Там написано, что это неправда.
>По их мнению, счетчик тиков съезжает скачками (что видно в тестовом приложении) из-за багов (!?) в некоторых чипсетах.
>... счетчик работает неверно, потому что современные процессоры могут менять свою частоту на лету, чтобы экономить энергию. Особенно это актуально для ноутбуков.
Меня эта статья напугала в своё время.
GluKoBug
Ну это мнение какого-то левого чувака (который раскрыл заговор, не иначе!), как-то МС посолидней будет.
QPC не обязан быть завязан на такты процессора, да и тот же rdtsc как не странно, не меняет свою частоту в Core 2 Duo процессорах при смене частоты, так что тот факт, что какие-то процы/чипсеты, которые не соответствуют требованиям QPC, но при этом сообщяют системе "посмотрите, я нормальный высокочастотный таймер, положитесь на меня!!1" - это баг и проблемы кривых процов/чипсетов.
NULL_PTR
> это баг и проблемы кривых процов/чипсетов
trollface.jpg нигде в MSDN не сказано ни о каких гарантиях QPC, нет ни одного стандарта на это дело, поэтому тот кто на это полагается криворукий разработчик, не иначе.
KpeHDeJIb
Откуда жир?
QueryPerformanceFrequency Function: The frequency cannot change while the system is running.
QueryPerformanceCounter Function: On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
NULL_PTR
> QueryPerformanceFrequency Function: The frequency cannot change while the system is running.
Ну это про QueryPerformanceFrequency а не про сам таймер, так что не надо тут троллить.
> However
> due to bugs
Нет гарантий.
Тема в архиве.