Alexey Korop
2009-11-06 14:22:42 UTC
Привет, All!
Раз уж тут есть ещё живые люди, то спрошу об отсчёте времени. Есть у меня
пара приложений, работающих сейчас под OS/2, и пора принимать решение, куда с
неё сваливать - под Линукс или под винду. При смене платформы, естественно,
хочется получить улучшение характеристик.
Так вот, один из вопросов - отсчёт небольших промежутков времени (единицы
миллисекунд), в идеале - с точностью до пары сотен микросекунд. Примерно для
этого как бы предназначен сабж, но результаты он даёт какие-то странные.
Использую периодический таймер, создаваемый так:
procedure StartTmr(var Tmr: TTmr; Period: Longint);
begin
Tmr.hTimer := CreateEvent(nil, False, False, nil);
Tmr.mmTimer := timeSetEvent(Period, 0, TFNTimeCallBack(Tmr.hTimer),
0, TIME_PERIODIC + TIME_CALLBACK_EVENT_SET);
Tmr.P := Period + 500; // таймаут
end;
Фактическое время меряю по тикам процессора (частота не меняется, ядро
одно).
Вот гистограммы с шагом 100 мкс для 1000 повторений с периодом 1, 2 и 3 мс,
для каждого по два прогона. XP SP2.
1
900 мкс 1
1000 мкс 972
1100 мкс 1
1200 мкс 2
1700 мкс 2
2000 мкс 22
900 мкс 1
1000 мкс 972
1100 мкс 1
1200 мкс 2
1700 мкс 2
2000 мкс 22
2
1700 мкс 4
1900 мкс 936
2000 мкс 8
2200 мкс 4
2900 мкс 48
1700 мкс 4
1900 мкс 934
2000 мкс 10
2200 мкс 4
2900 мкс 48
3
2700 мкс 2
2900 мкс 6
3000 мкс 917
3100 мкс 1
3200 мкс 2
3800 мкс 1
3900 мкс 70
4000 мкс 1
2700 мкс 2
2900 мкс 16
3000 мкс 907
3100 мкс 1
3200 мкс 2
3800 мкс 1
3900 мкс 70
4000 мкс 1
Складывается впечатление, что на самом деле используются прерывания от RTC
с частотой 1024 Гц, но 24 тика пропускаются, чтобы получилось как бы 1000 тиков
в секунду. Соответственно, некоторые промежутки оказываются почти на
миллисекунду длиннее, чем положено, так что о точности в 200 мкс не может быть
и речи.
Это меня глючит, или на самом деле нет чего-то, тикающего с точностью,
существенно лучше, чем миллисекунда?
(В Линуксе на этой же машине с абсолютно штатными средствами получается
нестабильность до 100 мкс, а с приложением некоторых левых средств - до 20 мкс.
При этом промежуток задаётся не в миллисекундах, а в наносекундах).
С уважением, Alexey.
...В действительности всё совсем не так, как на самом деле.
Раз уж тут есть ещё живые люди, то спрошу об отсчёте времени. Есть у меня
пара приложений, работающих сейчас под OS/2, и пора принимать решение, куда с
неё сваливать - под Линукс или под винду. При смене платформы, естественно,
хочется получить улучшение характеристик.
Так вот, один из вопросов - отсчёт небольших промежутков времени (единицы
миллисекунд), в идеале - с точностью до пары сотен микросекунд. Примерно для
этого как бы предназначен сабж, но результаты он даёт какие-то странные.
Использую периодический таймер, создаваемый так:
procedure StartTmr(var Tmr: TTmr; Period: Longint);
begin
Tmr.hTimer := CreateEvent(nil, False, False, nil);
Tmr.mmTimer := timeSetEvent(Period, 0, TFNTimeCallBack(Tmr.hTimer),
0, TIME_PERIODIC + TIME_CALLBACK_EVENT_SET);
Tmr.P := Period + 500; // таймаут
end;
Фактическое время меряю по тикам процессора (частота не меняется, ядро
одно).
Вот гистограммы с шагом 100 мкс для 1000 повторений с периодом 1, 2 и 3 мс,
для каждого по два прогона. XP SP2.
1
900 мкс 1
1000 мкс 972
1100 мкс 1
1200 мкс 2
1700 мкс 2
2000 мкс 22
900 мкс 1
1000 мкс 972
1100 мкс 1
1200 мкс 2
1700 мкс 2
2000 мкс 22
2
1700 мкс 4
1900 мкс 936
2000 мкс 8
2200 мкс 4
2900 мкс 48
1700 мкс 4
1900 мкс 934
2000 мкс 10
2200 мкс 4
2900 мкс 48
3
2700 мкс 2
2900 мкс 6
3000 мкс 917
3100 мкс 1
3200 мкс 2
3800 мкс 1
3900 мкс 70
4000 мкс 1
2700 мкс 2
2900 мкс 16
3000 мкс 907
3100 мкс 1
3200 мкс 2
3800 мкс 1
3900 мкс 70
4000 мкс 1
Складывается впечатление, что на самом деле используются прерывания от RTC
с частотой 1024 Гц, но 24 тика пропускаются, чтобы получилось как бы 1000 тиков
в секунду. Соответственно, некоторые промежутки оказываются почти на
миллисекунду длиннее, чем положено, так что о точности в 200 мкс не может быть
и речи.
Это меня глючит, или на самом деле нет чего-то, тикающего с точностью,
существенно лучше, чем миллисекунда?
(В Линуксе на этой же машине с абсолютно штатными средствами получается
нестабильность до 100 мкс, а с приложением некоторых левых средств - до 20 мкс.
При этом промежуток задаётся не в миллисекундах, а в наносекундах).
С уважением, Alexey.
...В действительности всё совсем не так, как на самом деле.