информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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 Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach