Здравствуйте, NetSlow, Вы писали:
NS>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.
Если операция толстая, и ее можно выполнять для измерения несколько секунд (несколько раз) — то стандартный clock, или GetTickCount.
Если надо поймать что-то совсем тонкое — ассемблерная команда rdtsc.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: кто как засекает время(C++)
От:
Аноним
Дата:
12.11.05 21:26
Оценка:
Здравствуйте, NetSlow, Вы писали:
NS>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, NetSlow, Вы писали:
NS>>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.
_W>Если операция толстая, и ее можно выполнять для измерения несколько секунд (несколько раз) — то стандартный clock, или GetTickCount. _W>Если надо поймать что-то совсем тонкое — ассемблерная команда rdtsc.
GetTime уж очень не точна. Лучше
QueryPerformanceCounter/QueryPerformanceFrequency
Здравствуйте, Сергей Мухин, Вы писали:
СМ>GetTime уж очень не точна. Лучше СМ>QueryPerformanceCounter/QueryPerformanceFrequency
Которая на многопроцессорных и HT системах внутри себя все равно пользуется rdtsc
а на синглпроц — пользуется счетчиком, который имеет довольно низкую частоту (у меня например QueryPerformanceFrequency = 3579545 при частоте проца в 2Гц)
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>GetTime уж очень не точна. Лучше СМ>>QueryPerformanceCounter/QueryPerformanceFrequency CC>Которая на многопроцессорных и HT системах внутри себя все равно пользуется rdtsc
мб, но это на С а то на ассемблере
CC>а на синглпроц — пользуется счетчиком, который имеет довольно низкую частоту (у меня например QueryPerformanceFrequency = 3579545 при частоте проца в 2Гц)
Здравствуйте, Сергей Мухин, Вы писали:
СМ>>>GetTime уж очень не точна. Лучше СМ>>>QueryPerformanceCounter/QueryPerformanceFrequency CC>>Которая на многопроцессорных и HT системах внутри себя все равно пользуется rdtsc СМ>мб, но это на С а то на ассемблере
Пфф. На С надо? Элементарно:
#pragma warning (push, disable: 1011) // это чтоб компилер ворнинг не кидал на то, что функция не возвращает значение явно
__forceinline __int64 __rdtsc ()
{
asm rdtsc;
}
#pragma warning (pop)
CC>>а на синглпроц — пользуется счетчиком, который имеет довольно низкую частоту (у меня например QueryPerformanceFrequency = 3579545 при частоте проца в 2Гц) СМ>это не всегда так. зависит, например от HT
При наличии поддежки НТ QueryPerformanceCounter ВСЕГДА будет использовать rdtsc а не один из счетчиков rdpmc.
Касательно того, что именно считают два 40битных Perfomance counter-а которые можно получить через rdpmc, я ничего особо внятного не нашел в свое время. Разве что только фразу: processor specific counters.
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, NetSlow, Вы писали:
NS>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.
Если понимать под операцией время, за которое её выполняет процессор, то где-то должны быть доки за сколько тактов выполняется та или иная команда ASM'a. Имея частоту прцессора получим время. Справедливо для архитектуры x86. В RISC архитектуре, насколько я понял, все команды выполняются за один такт процессора.
Дело тёмное, мог наврать
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
"В утренней тишине слышались только посвистывание сусликов и скрежетание нагревшихся ножовок." (с) Ильф и Петров
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>>>GetTime уж очень не точна. Лучше СМ>>>>QueryPerformanceCounter/QueryPerformanceFrequency CC>>>Которая на многопроцессорных и HT системах внутри себя все равно пользуется rdtsc СМ>>мб, но это на С а то на ассемблере
CC>Пфф. На С надо? Элементарно: CC>
CC>#pragma warning (push, disable: 1011) // это чтоб компилер ворнинг не кидал на то, что функция не возвращает значение явно
CC>__forceinline __int64 __rdtsc ()
CC>{
CC> asm rdtsc;
CC>}
CC>#pragma warning (pop)
CC>
вы товрищ немного наивны. кто сказал, что мы на интеле работаем?
да и на MS никто не говорил
вроде форум называется С/C++. а в стандарте придичных средств и нет.
но лучше пользоваться системно зависимыми QueryPerformanceCounter, чем процессозависимыми rdtsc. тем более я не уверен, что rdrcs есть на 64 и amd
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, vppb, Вы писали:
V>>Дело тёмное, мог наврать СМ>а тож!
Ну и я ж про это и говорю: самый точный подсчет. Там наносекунда, тут половинка. Глядишь, из несколких вариантов кода с какой-нибудь периферийной микросхомой и договоришься...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
"В утренней тишине слышались только посвистывание сусликов и скрежетание нагревшихся ножовок." (с) Ильф и Петров
Здравствуйте, NetSlow, Вы писали:
NS>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>вы товрищ немного наивны. кто сказал, что мы на интеле работаем? СМ>да и на MS никто не говорил
QueryPerformanceCounter подразумевает Win32 что в свою очередь в 90% случаев подразумевает x86 архитектуру.
Впрочем, если не wintel тогда откланиваюсь.
СМ>тем более я не уверен, что rdrcs есть на 64 и amd
rdtsc и rdpmc — есть.
rdrcs — не знаю такой.
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, NetSlow, Вы писали:
NS>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.
Засекать время програмно — абсолютно бесполезное занятие. Используйте профайлер и получите объективный результат.
(см. VTune, DevPartner и др.)
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
NS>>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.
BOP>Засекать время програмно — абсолютно бесполезное занятие. Используйте профайлер и получите объективный результат. BOP>(см. VTune, DevPartner и др.)
Не для всех платформ существуют профайлеры.
Мне лично приходилось писать самописный профайлер для изучения своего кода, работающего в ядре Linux 2.4 на процессоре arm.
Здравствуйте, NetSlow, Вы писали:
NS>Интересно было бы знать кто как засекает время, когда надо узнать время выполнения какой-то операции, в частности арифметической.