Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[Win32] WinApi Timer 18.09.02 21:02 Число просмотров: 1207
Автор: beetle <beetle> Статус: Member
|
LARGE_INTEGER liSearchStart,liSearchEnd,liCountsPerSec,liTotal;
if(!QueryPerformanceFrequency(&liCountsPerSec))
ERR
if(!QueryPerformanceCounter(&liSearchStart))
ERR
ptrMatchedElemPos = _find(dwResArraySize);
if(!QueryPerformanceCounter(&liSearchEnd))
ERR
liTotal.QuadPart = (liSearchEnd.QuadPart - liSearchStart.QuadPart)/(liCountsPerSec.QuadPart);
pos = (DWORD)(liTotal.QuadPart >> 32),(DWORD)liTotal.QuadPart& 0xFFFFFFFF);
|
<programming>
|
[Win32] WinApi Timer 11.09.02 22:27
Автор: Bublik Статус: Незарегистрированный пользователь
|
Подскажите помощью каких апи функций можно засечь сколько времени выполнялось то или иное действие.
|
|
[Win32] WinApi Timer 18.09.02 21:02
Автор: beetle <beetle> Статус: Member
|
LARGE_INTEGER liSearchStart,liSearchEnd,liCountsPerSec,liTotal;
if(!QueryPerformanceFrequency(&liCountsPerSec))
ERR
if(!QueryPerformanceCounter(&liSearchStart))
ERR
ptrMatchedElemPos = _find(dwResArraySize);
if(!QueryPerformanceCounter(&liSearchEnd))
ERR
liTotal.QuadPart = (liSearchEnd.QuadPart - liSearchStart.QuadPart)/(liCountsPerSec.QuadPart);
pos = (DWORD)(liTotal.QuadPart >> 32),(DWORD)liTotal.QuadPart& 0xFFFFFFFF);
|
|
Самый простой способ: GetTickCount(); 11.09.02 22:38
Автор: PS <PS> Статус: Elderman
|
|
| |
Самый простой способ: GetTickCount(): маленькое дополнение 12.09.02 12:43
Автор: Chingachguk <Chingachguk> Статус: Member
|
Простой, но его значение "плывет" в зависимости от числа задач, загруженности и т.д. и тики с точностью, равной установленной виндой частоты таймера.
|
| | |
а ты скажи у кого не плывет :) 12.09.02 14:34
Автор: PS <PS> Статус: Elderman
|
> Простой, но его значение "плывет" в зависимости от числа > задач, загруженности и т.д. и тики с точностью, равной > установленной виндой частоты таймера.
На "железные" часики все равно сесть нельзя. На них уже OS сидит и задачи по ним планирует.
А для большинства задач вообще time() достаточно. Для кого не достаточно, тому GetTickCount() выше крыши.
Никто же, в конце концов не додумывается писать real time систему в многозадачной OS ;)
|
| | | |
Самый надёжный вариант 13.09.02 08:54
Автор: HandleX <Александр М.> Статус: The Elderman
|
> На "железные" часики все равно сесть нельзя. На них уже OS > сидит и задачи по ним планирует. > А для большинства задач вообще time() достаточно. Для кого > не достаточно, тому GetTickCount() выше крыши. > Никто же, в конце концов не додумывается писать real time > систему в многозадачной OS ;)
Так ведь человеку нужно знать время, и поточнее, между двумя событиями! Поэтому может подойти такой вариант — хоть и на железные часики сесть нельзя, но на процессорные тики можно. Более того, это очень точная штука, поскольку в секунду процессор выполняет миллионы (а в последнее время и миллиарды) простейших операций в секунду. Итак, суть следующая: практически все современные процессоры имеют машинную инструкцию rdtsc, которая заталкивает в регистровую пару 64-битное значение количества машинных тиков процессора с момента его включения, т.е. если вы считали это значение, а потом через секунду (примерно) считали новое значение, и процессор у вас имеет частоту 800 МГц, то вы увидите увеличение этого значения примерно на 800,000,000,000. По-моему, точнее не бывает. А количество тиков в секунду можно расчитать усреднённое за несколько выборок или же усреднять к общей сетке, поскольку скорости процессоров весьма дискретны (кто шарит в железе, может подсказать).
На дельфи можно написать вот такую функцию:
function GetCPUTimeStamp: Int64; register;
asm
DW $310F
end;
---
Машинная инструкция rdtsc абсолютно свободно "разрешена к использованию" в пользовательских процессах защищённых OS.
И ещё один плюс — высокая скорость работы, поскольку это не вызов API. К тому же метод пригоден для измерения очень маленьких промежутков времени — к примеру, когда надо измерить скорость работы двух различных реализаций одной функции (чтобы выбрать наилучший), метод вполне пригоден.
|
| | | |
[Win32] Спасибо 13.09.02 00:31
Автор: Bublik Статус: Незарегистрированный пользователь
|
|
|
|