Форум: "WinAPI";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
ВнизПериоды времени мельше 1 милисекунды Найти похожие ветки
← →
Ромка (2006-04-10 19:16) [0]Существует ли в Windows возможность получать (засекать) периоды времени менше 1 милисекунды?
P.S. Я вот видел такие програмы, которие показывают время в отрезках 100-наносекунд
← →
Anatoly Podgoretsky © (2006-04-10 19:35) [1]Ипользуй аппаратный таймер, разрешающая способность порядка 300 пикосекунд, но на стабильность отсчетов особо не расчитывай.
← →
Ромка (2006-04-10 20:02) [2]А как мне добраться до апаратного таймера в Delphi?
← →
Anatoly Podgoretsky © (2006-04-10 20:07) [3]ассемблерная команда RDTSC
← →
Ромка (2006-04-10 20:10) [4]Спасибо. Буду розбиратся.
← →
Pavia © (2006-04-10 20:15) [5]QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger);-счетчик
QueryPerformanceFrequency(var lpFrequency: TLargeInteger); - частота
Виндоу будет использовать таймер с наибольшей частотой, каторый есть в системе.
Только учти, система может прервать выполнение одной задачи(потока) и передать на время, выполнение другой(другому).
← →
Чародей © (2006-04-10 20:57) [6]
> ассемблерная команда RDTSC
Привелигированная команда, придется драйверок писать
> QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger);
> -счетчик
> QueryPerformanceFrequency(var lpFrequency: TLargeInteger);
> - частота
Интересно, а что с этим делать? В цикле крутить??
← →
Pavia © (2006-04-10 21:03) [7]Чародей
Привелегерованная да, но она разрешенна в 3 колце, так что драйвер писать не придеться.
Не советую ей пользоваться,так как частота процессора может меняться из-за функций энерго сбережения.
Да в цикле крутить
Можно еще воспользоваться
GetSystemTimeAdjustment
SetSystemTimeAdjustment
← →
Цукор5 (2006-04-11 01:19) [8]Дядя Рихтер говорит,что сабж (меньше 1 милисекунды) не применим для ОС Win.
← →
Котик Б (2006-04-11 10:10) [9]Дядя Толя простите - но imho неправильно использовать RDTSC для расчётов времени, особенно на современных процессорах с троттлингом, QnQ и т.п.
Т.к. получить кол-во тактов мы еще сможем, но определить в каком режиме работает CPU (один или несколько) уже труднее.
Ка пример А64 при включении QnQ скидывает частоту практически в ДВА! раза.
Подробнее об использовании RDTSC см. тут
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=455
← →
Ромка (2006-04-12 16:55) [10]Так как же пользоваться этим RdTSC?
Или может есть какой то другой способ получать время с точностю больше 1 милисекунды?
Использование RdTSC, мне кажется, не подходит для ОС Windows NT
← →
Сергей М. © (2006-04-12 17:20) [11]
> с точностю больше 1 милисекунды?
Может соизволишь таки информировать общественность, зачем тебе понадобилось такое разрешение ?
← →
Ромка (2006-04-12 17:25) [12]Пишу прогу, которая должна работать с очень точной периферией. И засекать время с точностю 1 микросекунда, или даже точнее.
← →
Игорь Шевченко © (2006-04-12 18:14) [13]
> Привелигированная команда, придется драйверок писать
Вроде обычная.
← →
Anatoly Podgoretsky © (2006-04-12 19:30) [14]Pavia © (10.04.06 20:15) [5]
Можно, только точность падает, из-за вызова функции
Котик Б (11.04.06 10:10) [9]
Эка вас куда занесло.
Ромка (12.04.06 17:25) [12]
Не ту ОС используешь, тем более что такие выдержки должны делать аппаратно.
Чародей © (10.04.06 20:57) [6]
Сам решил или пробовал?
← →
Ромка (2006-04-12 19:43) [15]to Anatoly Podgoretsky
но если нет такой функции в самом устройстве, то как можна програмно засекать время с нужной точностю (WinXP)?
← →
Pavia © (2006-04-12 19:48) [16]2 Ромка
Определись микросекунда или милисекунда.
10^-3 или 10^-6
var i:int64;
asm
RDTSC
mov DWord[i],eax
mov DWord[i+4],edx
end;
Получаем счетчик t1 в начальный момент времени выполняем некоторую задачу получаем счетчик t2 разнится и будет время прошедшее. Только учти разные механизмы увеличиваю счетчик за разный периуд времени.
RDTSC счетчик увеличивается каждый такт процессора.
QueryPerformanceCounter счетчик увеличивается в зависемости от
QueryPerformanceFrequency
GetTickCount - счетк увеличивается, каждую микросекунду( 0.001 с)
← →
Ромка (2006-04-12 20:08) [17]Чем точнее, тем лучше.
Вообще, нужно 0,01 микросекунды. То есть, 10^-8 секунды.
← →
Anatoly Podgoretsky © (2006-04-12 20:11) [18]Ромка (12.04.06 19:43) [15]
RSTSC самое точное, затем идет QueryPerformanceCounter, точнее больше ничего нет. RSTSC это чтение независимого аппаратного счетчика процессора, один тик = один такт генератора. QueryPerformanceCounter работает на этой же основе, только нужна дополнительная коррекция на передачу параметров, вызов и возврат результата.
Величину выдержки которую можно получить при одном и том же вызове колеблется от 1 наносекунды до секунд. ОС не является системой жесткого реального времени, для этого надо уходить в ДОС
← →
Ромка (2006-04-12 20:25) [19]Но все же, можно ли (надежно ли) Windows использовать RDTSC?
Если да, то так мне перевести такты процессора в наносекунды (или частицы микросекунды)?
← →
Anatoly Podgoretsky © (2006-04-12 20:35) [20]Использовать можно, надежно нельзя и не только его, между двумя переключениями задач может пройти любое количество времени, не завивимо это Windows, QNX или другая ОС реального времени. Есть более одного желающего на любой ресурс, например на процессор.
Либо аппаратно, либо ДОС или другие ОС жесткого реального времени, однопрограммные. QNX и подобные дадут более лучшие результаты, но все равно далекие от желаемого.
← →
Ромка (2006-04-12 21:27) [21]Понятно. Так как же мне перевести такты процессора в время (при использовании RDTSC)?
← →
Anatoly Podgoretsky © (2006-04-12 21:52) [22]Калибровка, посчитать количество тактов за 100 мсек в режиме real time
Можно также восспользоваться функцией QueryPerformanceFrequency, как правило это частота тактового генератора.
← →
Ромка (2006-04-12 21:54) [23]Понятно. Спасибо Anatoly Podgoretsky. Пойду попробую.
← →
Fay © (2006-04-12 23:28) [24]2 Anatoly Podgoretsky © (12.04.06 21:52) [22]
> как правило это частота тактового генератора
The frequency cannot change while the system is running.
Чего нельзя сказать про частоту.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.012 c