Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

Чем можно заменить GetTickCount? Нужна точность до 1 мсек!   Найти похожие ветки 

 
Dr. Andrew   (2007-09-09 01:53) [0]

Доброй ночи, Мастера! GetTickCount дает точночть до 100 мсек, а мне нужно отсчитать время работы процедуры с точностью до 1 мсек. Подскажите как это можно реализовать.
Сейчас схематично процедура выглядит так, но меня не устраивает точность:

procedure TForm1.XXX();
var Ticks : Cardinal;
begin
  Ticks := GetTickCount;
  // блок выполнения кодов в процедуре
  Label1.Caption := IntToStr(GetTickCount - Ticks);
end;


Спасибо всем за любые идеи!


 
Германн ©   (2007-09-09 02:03) [1]


> Dr. Andrew   (09.09.07 01:53)
>
> Доброй ночи, Мастера! GetTickCount дает точночть до 100
> мсек

Кто тебе сказал такую глупость?


 
Dr. Andrew   (2007-09-09 02:11) [2]

Проверьте сами. Вообщем вопрос не в дискуссии о точности GetTickCount, а как можно отмерить отрезок времени с точностью до 1 мсек. Спасибо!


 
Германн ©   (2007-09-09 02:29) [3]


> Dr. Andrew   (09.09.07 02:11) [2]
>
> Проверьте сами.

Проверял и не один раз.

> Вообщем вопрос не в дискуссии о точности GetTickCount, а
> как можно отмерить отрезок времени с точностью до 1 мсек.
>  

А вот это уже другой вопрос, но не правильно заданный, имхо. Измерить можно, отмерить нельзя. Винда не даст.
Более конкретный ответ получишь, если дашь пример без ХХХ и без // :-)


 
Dr. Andrew   (2007-09-09 02:32) [4]

Спасибо за ответ, но сам код процедуры не имеет принципиального значения. Вы правы необходимо измерить отрезок времени выполнения кода и все с точностью до 1мсек. А код может быть какой угодно. Это не принципиально. Спасибо!


 
homm ©   (2007-09-09 07:55) [5]

QueryPerformanceCounter, QueryPerformanceFrequency


 
Rial ©   (2007-09-09 08:13) [6]

function rtNearestTime : Double;
Var
   F : TLargeInteger;
   C : TLargeInteger;
begin
QueryPerformanceFrequency(F);
QueryPerformanceCounter(C);
Result := 1000.0 * C / F;
end;


 
Sha ©   (2007-09-09 09:08) [7]

> Dr. Andrew

Даже при помощи GetTickCount можно получить большую точтость,
если использовать цикл.


 
Инс ©   (2007-09-09 11:45) [8]

Если вы таким образом хотите замерить скорость работы вашего алгоритма, то в общем случае, погрешность результата может быть очень большой из-за переключения контекстов планировщиком. Маленькие куски кода можно более или менее точно измерять с помощью команды RDTSC. А большие куски можно более или менее точно сравнить, скажем, запустив их в цикле 10000 раз.


 
Anatoly Podgoretsky ©   (2007-09-09 12:22) [9]

> homm  (09.09.2007 07:55:05)  [5]

Это что то меняет?


 
Anatoly Podgoretsky ©   (2007-09-09 12:22) [10]

> Инс  (09.09.2007 11:45:08)  [8]

> Маленькие куски кода можно более или менее точно измерять с помощью команды RDTSC

Это что то меняет?


 
Anatoly Podgoretsky ©   (2007-09-09 12:27) [11]

Что бы более или менее надежно отмерять такие короткие интервалы, нужна другая ОС РВ, с такто на порядок короче отмеряемого интервала, то есть не 10 мс, а 100 нс, не знаю, более специализированые ОС могут ли работать с таким системным тактом.

А насчет точности GetTickCount можно не волноваться, у него как раз точность 1 МС


 
Anatoly Podgoretsky ©   (2007-09-09 12:27) [12]

Удалено модератором


 
homm ©   (2007-09-09 12:28) [13]

> [9] Anatoly Podgoretsky ©   (09.09.07 12:22)
> Это что то меняет?

Нет, оно что-то возвращает. Смотреть описание функций и справку.


 
homm ©   (2007-09-09 12:29) [14]

> А насчет точности GetTickCount можно не волноваться, у него
> как раз точность 1 МС

Нет.


 
Anatoly Podgoretsky ©   (2007-09-09 13:24) [15]

> homm  (09.09.2007 12:29:14)  [14]

Ты кажется меня в справку посылал, не хочешь ее сам посмотреть?


 
homm ©   (2007-09-09 13:34) [16]

> [15] Anatoly Podgoretsky ©   (09.09.07 13:24)

The GetTickCount function retrieves the number of milliseconds that have elapsed since Windows was started.

DWORD GetTickCount(VOID)

Parameters

This function has no parameters.

Return Values

If the function succeeds, the return value is the number of milliseconds that have elapsed since Windows was started.

Нигде не сказано, что разрешение 1 мс, тем более что это и в действительности не так.


 
Anatoly Podgoretsky ©   (2007-09-09 13:37) [17]

> homm  (09.09.2007 13:34:16)  [16]

Теперь попробуй это прочитать с помощью словарика.


 
oxffff ©   (2007-09-09 13:46) [18]


> Anatoly Podgoretsky ©   (09.09.07 12:27) [12]
> Удалено модератором


Такое разве возможно?


 
Anatoly Podgoretsky ©   (2007-09-09 13:50) [19]

> oxffff  (09.09.2007 13:46:18)  [18]

А почему нет, разве есть неприкасаемые?


 
oxffff ©   (2007-09-09 13:53) [20]


> Anatoly Podgoretsky ©   (09.09.07 13:50) [19]
> > oxffff  (09.09.2007 13:46:18)  [18]
>
> А почему нет, разве есть неприкасаемые?


А вы разве не модератор?
:)


 
Anatoly Podgoretsky ©   (2007-09-09 14:11) [21]

> oxffff  (09.09.2007 13:53:20)  [20]

Ну я и отмодерировал


 
Германн ©   (2007-09-09 14:14) [22]


> Anatoly Podgoretsky ©   (09.09.07 14:11) [21]

Наверняка с большим удовольствием :-)


 
Anatoly Podgoretsky ©   (2007-09-09 14:17) [23]

> Германн  (09.09.2007 14:14:22)  [22]

Ну не каждый же день такое удается :-)


 
Jeer ©   (2007-09-10 15:24) [24]


> homm ©   (09.09.07 13:34) [16]


Полагаю не стоит путать точность и дискретность.
Дискретность GetTickCount заявлена в 1 ms и точка, поскольку возвращаемый тип "целое" не дает надежды на большее.
Для неудачности исполнения GetTickCount следует постараться особым образом, поэтому на меньшее тоже особо не стоит рассчитывать.
Точность же дискретности - тема hardware, но полагаю, что варианты измерения интервала в 100 мс (тиков) и 100.1 мс (реал) отличаются незначительно, с точки зрения практических результатов.

Если же говорить о методическом подходе, то Инс все разложил по полочкам в [8].
Инструмент же измерения может может любым, адекватным текущей задаче измерения (RDTSC, QueryPerf, GetTickCount)


 
homm ©   (2007-09-10 15:30) [25]

> Дискретность GetTickCount заявлена в 1 ms и точка

В справке виндовс очень много всего, что заявлено. Тем не менее это не так. Дискретность GetTickCount для винНТ 10 мсек, для 9х было, кажеться, 50 или около того. (могу вечером проверить);


 
clickmaker ©   (2007-09-10 15:35) [26]


> Дискретность GetTickCount заявлена в 1 ms

кем?


 
Jeer ©   (2007-09-10 15:39) [27]

homm ©   (10.09.07 15:30) [25]
clickmaker ©   (10.09.07 15:35) [26]

Зависит от системы + возможности типа.


 
homm ©   (2007-09-10 15:39) [28]

> [27] Jeer ©   (10.09.07 15:39)

Чего? ты же сказал, что она заявлена в 1 мс.


 
homm ©   (2007-09-10 15:40) [29]

> [27] Jeer ©   (10.09.07 15:39)
> возможности типа

Это кстати, вообще о чем?


 
clickmaker ©   (2007-09-10 15:44) [30]

GetSystemTimeAdjustment ?


 
Jeer ©   (2007-09-10 15:44) [31]


> homm ©   (10.09.07 15:39) [28]
>
> > [27] Jeer ©   (10.09.07 15:39)


Оговорился - 10 ms для nT
Системный таймер можно поднастроить из boot.ini


 
Jeer ©   (2007-09-10 15:46) [32]


> homm ©   (10.09.07 15:40) [29]
>
> > [27] Jeer ©   (10.09.07 15:39)
> > возможности типа
>
> Это кстати, вообще о чем?


Это к тому, что тип целое позволяет дискретизировать до 1 ms, что никак в лучшую сторону, впрочем, не связано со slice системы:))


 
Jeer ©   (2007-09-10 15:48) [33]

Sets the resolution of the system timer on the standard x86 multiprocessor HAL (Halmps.dll). The argument is a number interpreted in hundreds of nanoseconds, but the rate is set to the closest resolution the HAL supports that isn"t larger than the one requested. The HAL supports the following resolutions: Hundreds of nanoseconds Milliseconds (ms) 9766 0.98 19532 2.00 39063 3.90 78125 7.80 The default resolution is 7.8 ms.


 
Jeer ©   (2007-09-10 15:50) [34]

NtSetTimerResolution and NtQueryTimerResolution are defined as follows. All times are specifified in hundreds of nanoseconds.

NTSTATUS NtSetTimerResolution (
 IN ULONGRequestedResolution,
 IN BOOLEANSet,
 OUT PULONGActualResolution
);

Parameters

RequestedResolution

The desired timer resolution. Must be within the legal range of system timer values supported by NT. On standard x86 systems this is 1-10 milliseconds. Values that are within the acceptable range are rounded to the next highest millisecond boundary by the standard x86 HAL. This parameter is ignored if the Set parameter is FALSE.

MinimumResolution

The minimum timer resolution. On standard x86 systems this is 0x2625A, which is about 10 milliseconds

MaximumResolution

The maximum timer resolution. On standard x86 systems this is 0x2710, which is about 1 millisecond.


 
Jeer ©   (2007-09-10 15:56) [35]

В дополнение к [8] для измерения времени собственно затрачиваемых на код, а не + его системную обслугу следует пользоваться GetProcessTimes, что позволяет иметь дискретность 100 ns


 
wait   (2007-09-19 11:13) [36]

http://support.microsoft.com/kb/172338



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.063 c
6-1175280082
Адепт Магии Слова
2007-03-30 22:41
2007.12.09
Как програмно можно изменить рабочую группу компьютера


6-1175622907
Tiberius
2007-04-03 21:55
2007.12.09
Где найти ieConst.pas и IEDocHostUIHandler.pas


2-1194700779
AlexanderMS
2007-11-10 16:19
2007.12.09
Победить мерцание на Canvas е.


2-1195196950
alikon1
2007-11-16 10:09
2007.12.09
Факториал дробного числа


15-1194352859
phillip
2007-11-06 15:40
2007.12.09
Помогите найти мануал...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский