информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаЗа кого нас держат?Страшный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Самый надёжный вариант 13.09.02 08:54  Число просмотров: 1516
Автор: 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. К тому же метод пригоден для измерения очень маленьких промежутков времени — к примеру, когда надо измерить скорость работы двух различных реализаций одной функции (чтобы выбрать наилучший), метод вполне пригоден.
<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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach