powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / QueryPerfomance...
25 сообщений из 31, страница 1 из 2
QueryPerfomance...
    #39598134
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к теме времени выполнения определенного фрагмента кода или программы (тема Профилировщик) я решил это попробовать в самом Дельфи с помощью функции QueryPerfomanceFrequency/Counter;
На форме я разместил таймер и кнопку.
Код нажатия на кнопку:
Код: pascal
1.
2.
3.
4.
  QueryPerformanceFrequency(freq);
  QueryPerformanceCounter(t1);
 // g1:=GetTickCount;
  Timer1.Enabled:=True


Событие OnTimer:
Код: pascal
1.
2.
3.
4.
5.
6.
Timer1.Enabled:=False;
//  g2:=GetTickCount;
  QueryPerformanceCounter(t2);
  TimeInterval:=(t2-t1)/freq;
//  ginterval:=(g2-g1) div 1000;
  Showmessage(FloatToStr(TimeInterval))


На то что закоментированно, пока не обращайте внимания.
В общем хотел сравнить, правильно ли высчитывается промежуток времени, который отстучал таймер.
Ниже значения Св-во Interval таймера (я сразу в сек. буду писать) = Результат вычисления TimeInterval (то что ShowMessage выводит)

1000 (1 с)=0.878; 5 сек=4.436; 10 сек=8.877; 20 сек=17,73
Т.е несовпадение, вычисленный интервал меньше, да к тому же чем больше значения таймера, тем больше разница. Я несколько раз перезапускал программу с теми же значениями таймера, в принципе результат тот же, небольшие отличия только в сотых и тысячных частях дроби.
А вот с GetTickCount таких проблем нету, сколько таймер отстучал, столько и показал ( в коде закоментировано, я потом с ним проверал те же самые интервалы). Может я неправильно вычисляю как то TimeInterval?
А вот меньше секунды я уже не проверял, потому что Timer будет давать погрешности, но я думаю что GetTickCount тоже правильно вычислит. Конечно, если поставить QueryPerfomanceFrequency/Counter например между одним циклом, а потом другим циклом и сравнить, то даже по этим значениям можно определить что быстрее, но все таки хотелось разобраться почему со временем не совпадает
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598266
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,
Не может такого быть.
Выкладывай весь проект и скажи на чем компилишь.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598321
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисDamir_85,
Не может такого быть.
Выкладывай весь проект и скажи на чем компилишь.

ставлю на то что таймер уже включен
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598333
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear Penguinставлю на то что таймер уже включен Маловероятно
Damir_85А вот с GetTickCount таких проблем нету,
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598373
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспоминается история, что когда-то вышел двуядерный Athlon X2 многие игры начали глючить.
Они для скорости использовали какой-то hi-res таймер, который основывался на количестве циклов процессора.
Вот только частота процессора все время плавала и "цена" одного такта все время менялась.
Причём почему-то на двуядерных процессорах - по разному для каждого ядра.
И AMD даже какую-то утилиту выпускала, чтобы убить эту функцию в процессоре, чтобы счетчики тактов стали дубовыми и предсказуемыми.

Но на самом деле я это слышал краем уха, как забавный курьёз, и деталей не помню вообще никаких.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598376
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://ru.wikipedia.org/wiki/PowerNow! и так далее


в разных утилитах, например RMClock вроде были гистограммы физической частоты процессора, можно запустить, поработать в разных программах несколько минут, а потом посмотреть как частота менялась.
http://cpu.rightmark.org/

У меня на старом ноуте, например, частота процессора прыгала в диапазоне от 600 до 1500 МГц несколько раз в секунду


Damir_85
Код: pascal
1.
TimeInterval:=(t2-t1)/freq;



и тут нужно не делить на однократно взятую константу, а непрерывно интегрировать
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598381
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисDamir_85,
Не может такого быть.
Выкладывай весь проект и скажи на чем компилишь.
Embarcadero 2010. Процессор Core Duo 2,7 ГГц. Попробую завтра выложить, но там особо ниче нету, кнопка и таймер. Даже код можете скопировать, у себя проверить. Я вот подумал , может частоту процессора считывать не вначале, а когда таймер закончит работать.
Что касается GetTickCount: я запустил цикл for от 1 до 1000, GetTickCount выдал 0, а с QueryPerfomanceCounter хоть что то показывает.
Видимо для GetTickCount слишком маленький интервал был
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598387
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видел на одном из форумов такую формулу
Dt := (t - Dt) / (M * Fr);
(t - Dt)-это разность как и у меня
но M объявлена как константа и равна 10
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598392
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch
Damir_85
Код: pascal
1.
TimeInterval:=(t2-t1)/freq;



и тут нужно не делить на однократно взятую константу, а непрерывно интегрировать
Но freq это же не константа
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598393
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85Ariochпропущено...


и тут нужно не делить на однократно взятую константу, а непрерывно интегрировать
Но freq это же не константа

вот именно, поэтому и непрерывно, что не константа.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598395
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85видел на одном из форумов такую формулу
Dt := (t - Dt) / (M * Fr);
(t - Dt)-это разность как и у меня
но M объявлена как константа и равна 10
Я просто почему так не написал, я не понимаю для чего это константа нужна
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598402
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85Попробую завтра выложить, но там особо ниче нету, кнопка и таймер. Особое может быть в другом, например в типе переменных.

Damir_85Даже код можете скопировать, у себя проверить. Ты думаешь, косяк hr-таймера мог безнаказанно прожить 20+ лет?
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598422
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,

у тебя - константа

ты ее один раз вычисляешь и дальше передаешь в функцию-счетчик как неизменяемый параметр

Damir_85частоту процессора считывать не вначале, а когда таймер закончит работать

заменить одну константу на другую, бесполезно

интегрировать надо, постоянно отслеживать бесконечно малые изменения скорости

представь себе движение автобуса по городу. У тебя есть три числа
1) отметка времени t0 взятая наугад в случайной точке маршрута
2) отметка времени t1 = t0+dt примерно на полчаса позже, но тоже наугад
3) скорость автобуса v0 в момент t0 (или любой другой наугад взятый момент)

какая вероятность, что v0 случайно совпадёт со средней скоростью автобуса за эти полчаса?
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598424
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисТы думаешь, косяк hr-таймера мог безнаказанно прожить 20+ лет?

а там нет косяка
количество циклов процессора тебе честно сказали
то, что цена циклов плавае тво время работы, ну извините, 20 лет назад частота процессора задавалась только кнопкой Турбо и в процессе работы программы уже не менялась
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598435
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochDamir_85,

у тебя - константа

ты ее один раз вычисляешь и дальше передаешь в функцию-счетчик как неизменяемый параметр

Damir_85частоту процессора считывать не вначале, а когда таймер закончит работать

заменить одну константу на другую, бесполезно

интегрировать надо, постоянно отслеживать бесконечно малые изменения скорости

представь себе движение автобуса по городу. У тебя есть три числа
1) отметка времени t0 взятая наугад в случайной точке маршрута
2) отметка времени t1 = t0+dt примерно на полчаса позже, но тоже наугад
3) скорость автобуса v0 в момент t0 (или любой другой наугад взятый момент)

какая вероятность, что v0 случайно совпадёт со средней скоростью автобуса за эти полчаса?
Если я правильно понимаю, то нужно переменную freq вычислять не один раз, а несколько, чтобы потом взять усредненное значение.
Но просто где в коде его столько раз считывать, я ведь могу его поставить либо до начала работы таймера, либо после окончания работы тайера
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598450
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...и все равно точного совпадения не получишь.

QueryPerformanceCounter - это не про то.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598455
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,
согласно документации MS, частота QueryPerformanceFrequency не меняется во время работы системы.
МайкрософтRetrieves the frequency of the performance counter. The frequency of the performance counter is fixed at system boot and is consistent across all processors. Therefore, the frequency need only be queried upon application initialization, and the result can be cached .
Частота не плавает, интегрировать не нужно. Вот тут подробней:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/dn553408(v=vs.85).aspx#general_faq_about_qpc_and_tsc
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598456
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,
из ссылки в пред сообщении:
авторIs QPC accuracy affected by processor frequency changes caused by power management or Turbo Boost technology?

No. If the processor has an invariant TSC, the QPC is not affected by these sort of changes. If the processor doesn't have an invariant TSC, QPC will revert to a platform hardware timer that won't be affected by processor frequency changes or Turbo Boost technology.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598462
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, может сам компонент Timer какие то погрешности вводит и проверять нужно каким нибудь sleep ()
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598466
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,

Другими словами, тупик.

Через СчётчикПроизводтиельности ты считаешь свою программу в единицах процессорных циклов, и это правильно.
Чтобы понять хорошо или плохо оптимизирована твоя программа - надо понимать много или мало ресурсов процессора она потребляет, а не насколько крутой и дорогой процессор ее запускает.

Так что подумай

1) а нужно ли вообще тебе точное количество секунд? зачем? тот же Intel V-tune вроде бы показывает процент процессорного времени в разнхы функциях, и да, его можно домножить на общее время, для наглядности, но это именно плюс-минус километр, чтобы легче было примерно на пальцах рассуждать.

2) если тебе нужно точное количество секунд - вероятно тебе нужн какой-то другой таймер, привязанный к времени, а не к процессору.

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644900.aspx
MicrosoftHigh-Resolution Timer

A counter is a general term used in programming to refer to an incrementing variable. Some systems include a high-resolution performance counter that provides high-resolution elapsed times.

If a high-resolution performance counter exists on the system, you can use the QueryPerformanceFrequency function to express the frequency, in counts per second. The value of the count is processor dependent. On some processors, for example, the count might be the cycle rate of the processor clock.

The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter. By calling this function at the beginning and end of a section of code, an application essentially uses the counter as a high-resolution timer . For example, suppose that QueryPerformanceFrequency indicates that the frequency of the high-resolution performance counter is 50,000 counts per second. If the application calls QueryPerformanceCounter immediately before and immediately after the section of code to be timed, the counter values might be 1500 counts and 3500 counts, respectively. These values would indicate that .04 seconds (2000 counts) elapsed while the code executed.

Оцени изящество слога. Ты *можешь* использовать счетчик вместо таймера и результаты *будут указывать*, что прошло некоторое время. Но нигде не говорится, что именно это время прошло.

Я кстати вспоминаю насчёт AMD
Там кажется счетчики были в каждом ядре отдельно.
И при малой нагрузке некоторые ядра отключались в глубокий сон, как следствие их счетчики тоже не шли, пока ядро снова не включалось в работу.
Т.е. у разных ядер значения циклов - ноль после вклчюения комьпютера - по мере работы разбегалось.
Далее игрушка запускала проверку, QueryPerformanceCounter, что-то делала и потом вызывала еще раз.
Вот только в промежутке Windows перебрасывала поток на другое ядро, свободное.
И игрушка получала что t2 < t1 и сходила с ума.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598472
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Частота не плавает, интегрировать не нужно. Вот тут подробней:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/dn553408(v=vs.85).aspx#general_faq_about_qpc_and_tsc

MicrosoftQPC is available on Windows XP and Windows 2000 and works well on most systems . However, some hardware systems' BIOS didn't indicate the hardware CPU characteristics correctly (a non-invariant TSC), and some multi-core or multi-processor systems used processors with TSCs that couldn't be synchronized across cores. Systems with flawed firmware that run these versions of Windows might not provide the same QPC reading on different cores if they used the TSC as the basis for QPC.

I rest my case, Your Honour.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598487
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

то есть на некоторых компьютерах под Windows XP и Windows 2000 на разных ядрах могут быть разные показания QPC.

Вы уверены, что именно этот случай у ТС, что гордо написали I rest my case? И уверены, что ошибка будет в таких масштабах, как у ТС? Я сильно сомневаюсь во втором - скорее всего какая-то ошибка в логике измерений, и не факт, что у ТС Windows XP.
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598499
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochDamir_85,



1) а нужно ли вообще тебе точное количество секунд?...
Я тоже об этом подумал. Если основная цель это оценка скорости фрагмента кода или программы, то в принципе по двум значениям (пусть даже они точно и не указывают время , затраченное на алгоритм) двух алгоритмов уже можно понять разницу в их скорости.
Можно конечно более приближенно собрать информацию. Я тут про статистику вспомнил. Запускать таймер на 1 сек, потом на 2 сек, и так далее, ну допустим до минуты, или 5 минут, при этом программа записывает вычисленное время и время таймера, т.е сделать выборку. Потом для каждого интервала найти разницу: 1 сек=0,8, разница 0,2; 2 cек=1,85 разница 0,15 и т.д. для каждого значения.
Найти среднее арифм. уже по разницам, (вроде так, еще было понятие дисперсии, но я что то не помню что она делала), а потом найденную погрешность учитывать при вычислении формулы.
Только я незнаю , может для одного компьютера одна погрешность, для другого другая получится, а может и нет. Но в принципе можно на нужно машине как утилиту запустить, проверить и добавить погрешность. Но конечно все это лишняя работа, может и не нужна такая точность
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598502
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Arioch,

то есть на некоторых компьютерах под Windows XP и Windows 2000 на разных ядрах могут быть разные показания QPC.

Вы уверены, что именно этот случай у ТС, что гордо написали I rest my case? И уверены, что ошибка будет в таких масштабах, как у ТС? Я сильно сомневаюсь во втором - скорее всего какая-то ошибка в логике измерений, и не факт, что у ТС Windows XP.
WinXp). Логика измерений у меня в самом начале приведена. Интересно кстати сравнить с Win7 по показаниям
...
Рейтинг: 0 / 0
QueryPerfomance...
    #39598507
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Вы уверены, что именно этот случай у ТС, что гордо написали I rest my case?

Нет. Я просто вижу, что Майкрософт не гарантирует того математически чистого результата, о котором речь.

Как с динозаврами, 50%, то ли встречу то ли нет.

Поэтому закладываться на это я бы не стал, чтобы потом не пришлось еще тщательно подбирать все железо и все версии драйверов и все настройки BIOS и потом ещё при каждом обновлении все это заново сертифицировать.

Damir_85WinXp)
...в. которйо еще не было поддержки ни HPET ни ACPI timers
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / QueryPerfomance...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]