|
|
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Возвращаясь к теме времени выполнения определенного фрагмента кода или программы (тема Профилировщик) я решил это попробовать в самом Дельфи с помощью функции QueryPerfomanceFrequency/Counter; На форме я разместил таймер и кнопку. Код нажатия на кнопку: Код: pascal 1. 2. 3. 4. Событие OnTimer: Код: pascal 1. 2. 3. 4. 5. 6. На то что закоментированно, пока не обращайте внимания. В общем хотел сравнить, правильно ли высчитывается промежуток времени, который отстучал таймер. Ниже значения Св-во Interval таймера (я сразу в сек. буду писать) = Результат вычисления TimeInterval (то что ShowMessage выводит) 1000 (1 с)=0.878; 5 сек=4.436; 10 сек=8.877; 20 сек=17,73 Т.е несовпадение, вычисленный интервал меньше, да к тому же чем больше значения таймера, тем больше разница. Я несколько раз перезапускал программу с теми же значениями таймера, в принципе результат тот же, небольшие отличия только в сотых и тысячных частях дроби. А вот с GetTickCount таких проблем нету, сколько таймер отстучал, столько и показал ( в коде закоментировано, я потом с ним проверал те же самые интервалы). Может я неправильно вычисляю как то TimeInterval? А вот меньше секунды я уже не проверял, потому что Timer будет давать погрешности, но я думаю что GetTickCount тоже правильно вычислит. Конечно, если поставить QueryPerfomanceFrequency/Counter например между одним циклом, а потом другим циклом и сравнить, то даже по этим значениям можно определить что быстрее, но все таки хотелось разобраться почему со временем не совпадает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 13:07 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Damir_85, Не может такого быть. Выкладывай весь проект и скажи на чем компилишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 15:07 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисDamir_85, Не может такого быть. Выкладывай весь проект и скажи на чем компилишь. ставлю на то что таймер уже включен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 16:18 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Tactical Nuclear Penguinставлю на то что таймер уже включен Маловероятно Damir_85А вот с GetTickCount таких проблем нету, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 16:34 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Вспоминается история, что когда-то вышел двуядерный Athlon X2 многие игры начали глючить. Они для скорости использовали какой-то hi-res таймер, который основывался на количестве циклов процессора. Вот только частота процессора все время плавала и "цена" одного такта все время менялась. Причём почему-то на двуядерных процессорах - по разному для каждого ядра. И AMD даже какую-то утилиту выпускала, чтобы убить эту функцию в процессоре, чтобы счетчики тактов стали дубовыми и предсказуемыми. Но на самом деле я это слышал краем уха, как забавный курьёз, и деталей не помню вообще никаких. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:31 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
https://ru.wikipedia.org/wiki/PowerNow! и так далее в разных утилитах, например RMClock вроде были гистограммы физической частоты процессора, можно запустить, поработать в разных программах несколько минут, а потом посмотреть как частота менялась. http://cpu.rightmark.org/ У меня на старом ноуте, например, частота процессора прыгала в диапазоне от 600 до 1500 МГц несколько раз в секунду Damir_85 Код: pascal 1. и тут нужно не делить на однократно взятую константу, а непрерывно интегрировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:37 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисDamir_85, Не может такого быть. Выкладывай весь проект и скажи на чем компилишь. Embarcadero 2010. Процессор Core Duo 2,7 ГГц. Попробую завтра выложить, но там особо ниче нету, кнопка и таймер. Даже код можете скопировать, у себя проверить. Я вот подумал , может частоту процессора считывать не вначале, а когда таймер закончит работать. Что касается GetTickCount: я запустил цикл for от 1 до 1000, GetTickCount выдал 0, а с QueryPerfomanceCounter хоть что то показывает. Видимо для GetTickCount слишком маленький интервал был ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:43 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
видел на одном из форумов такую формулу Dt := (t - Dt) / (M * Fr); (t - Dt)-это разность как и у меня но M объявлена как константа и равна 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:49 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Arioch Damir_85 Код: pascal 1. и тут нужно не делить на однократно взятую константу, а непрерывно интегрировать Но freq это же не константа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:50 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Damir_85Ariochпропущено... и тут нужно не делить на однократно взятую константу, а непрерывно интегрировать Но freq это же не константа вот именно, поэтому и непрерывно, что не константа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:51 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Damir_85видел на одном из форумов такую формулу Dt := (t - Dt) / (M * Fr); (t - Dt)-это разность как и у меня но M объявлена как константа и равна 10 Я просто почему так не написал, я не понимаю для чего это константа нужна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:52 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Damir_85Попробую завтра выложить, но там особо ниче нету, кнопка и таймер. Особое может быть в другом, например в типе переменных. Damir_85Даже код можете скопировать, у себя проверить. Ты думаешь, косяк hr-таймера мог безнаказанно прожить 20+ лет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 17:57 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Damir_85, у тебя - константа ты ее один раз вычисляешь и дальше передаешь в функцию-счетчик как неизменяемый параметр Damir_85частоту процессора считывать не вначале, а когда таймер закончит работать заменить одну константу на другую, бесполезно интегрировать надо, постоянно отслеживать бесконечно малые изменения скорости представь себе движение автобуса по городу. У тебя есть три числа 1) отметка времени t0 взятая наугад в случайной точке маршрута 2) отметка времени t1 = t0+dt примерно на полчаса позже, но тоже наугад 3) скорость автобуса v0 в момент t0 (или любой другой наугад взятый момент) какая вероятность, что v0 случайно совпадёт со средней скоростью автобуса за эти полчаса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:09 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисТы думаешь, косяк hr-таймера мог безнаказанно прожить 20+ лет? а там нет косяка количество циклов процессора тебе честно сказали то, что цена циклов плавае тво время работы, ну извините, 20 лет назад частота процессора задавалась только кнопкой Турбо и в процессе работы программы уже не менялась ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:10 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
AriochDamir_85, у тебя - константа ты ее один раз вычисляешь и дальше передаешь в функцию-счетчик как неизменяемый параметр Damir_85частоту процессора считывать не вначале, а когда таймер закончит работать заменить одну константу на другую, бесполезно интегрировать надо, постоянно отслеживать бесконечно малые изменения скорости представь себе движение автобуса по городу. У тебя есть три числа 1) отметка времени t0 взятая наугад в случайной точке маршрута 2) отметка времени t1 = t0+dt примерно на полчаса позже, но тоже наугад 3) скорость автобуса v0 в момент t0 (или любой другой наугад взятый момент) какая вероятность, что v0 случайно совпадёт со средней скоростью автобуса за эти полчаса? Если я правильно понимаю, то нужно переменную freq вычислять не один раз, а несколько, чтобы потом взять усредненное значение. Но просто где в коде его столько раз считывать, я ведь могу его поставить либо до начала работы таймера, либо после окончания работы тайера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:18 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
...и все равно точного совпадения не получишь. QueryPerformanceCounter - это не про то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:27 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:29 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:30 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Интересно, может сам компонент Timer какие то погрешности вводит и проверять нужно каким нибудь sleep () ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:36 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
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 и сходила с ума. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:39 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:43 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
Arioch, то есть на некоторых компьютерах под Windows XP и Windows 2000 на разных ядрах могут быть разные показания QPC. Вы уверены, что именно этот случай у ТС, что гордо написали I rest my case? И уверены, что ошибка будет в таких масштабах, как у ТС? Я сильно сомневаюсь во втором - скорее всего какая-то ошибка в логике измерений, и не факт, что у ТС Windows XP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 18:59 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
AriochDamir_85, 1) а нужно ли вообще тебе точное количество секунд?... Я тоже об этом подумал. Если основная цель это оценка скорости фрагмента кода или программы, то в принципе по двум значениям (пусть даже они точно и не указывают время , затраченное на алгоритм) двух алгоритмов уже можно понять разницу в их скорости. Можно конечно более приближенно собрать информацию. Я тут про статистику вспомнил. Запускать таймер на 1 сек, потом на 2 сек, и так далее, ну допустим до минуты, или 5 минут, при этом программа записывает вычисленное время и время таймера, т.е сделать выборку. Потом для каждого интервала найти разницу: 1 сек=0,8, разница 0,2; 2 cек=1,85 разница 0,15 и т.д. для каждого значения. Найти среднее арифм. уже по разницам, (вроде так, еще было понятие дисперсии, но я что то не помню что она делала), а потом найденную погрешность учитывать при вычислении формулы. Только я незнаю , может для одного компьютера одна погрешность, для другого другая получится, а может и нет. Но в принципе можно на нужно машине как утилиту запустить, проверить и добавить погрешность. Но конечно все это лишняя работа, может и не нужна такая точность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 19:09 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
s62Arioch, то есть на некоторых компьютерах под Windows XP и Windows 2000 на разных ядрах могут быть разные показания QPC. Вы уверены, что именно этот случай у ТС, что гордо написали I rest my case? И уверены, что ошибка будет в таких масштабах, как у ТС? Я сильно сомневаюсь во втором - скорее всего какая-то ошибка в логике измерений, и не факт, что у ТС Windows XP. WinXp). Логика измерений у меня в самом начале приведена. Интересно кстати сравнить с Win7 по показаниям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 19:16 |
|
||
|
QueryPerfomance...
|
|||
|---|---|---|---|
|
#18+
s62Вы уверены, что именно этот случай у ТС, что гордо написали I rest my case? Нет. Я просто вижу, что Майкрософт не гарантирует того математически чистого результата, о котором речь. Как с динозаврами, 50%, то ли встречу то ли нет. Поэтому закладываться на это я бы не стал, чтобы потом не пришлось еще тщательно подбирать все железо и все версии драйверов и все настройки BIOS и потом ещё при каждом обновлении все это заново сертифицировать. Damir_85WinXp) ...в. которйо еще не было поддержки ни HPET ни ACPI timers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2018, 19:19 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39598507&tid=2041255]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 484ms |

| 0 / 0 |
