Mayor
Специалист
Offline
|
|
« : 27-07-2009 12:50 » |
|
[c++] run time difference
какие существуют методы посчитать разницу времени выполнения 2х реализаций одной функции\алгоритма?
|
|
|
Записан
|
1n c0de we trust
|
|
|
Sla
|
|
« Ответ #1 : 27-07-2009 12:54 » |
|
какие мтоды ты можешь предложить сам?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #2 : 27-07-2009 13:38 » |
|
Использовать какую-либо функцию из run-time библиотеки, которая по точнее. В POSIX можно так: #include <time.h>
clock_t start, end; double cpu_time_used;
start = clock(); // .... end = clock(); cpu_time_used = (end - start) / CLOCKS_PER_SEC;
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #3 : 28-07-2009 05:21 » |
|
профайлер и тики
|
|
|
Записан
|
Странно всё это....
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #4 : 28-07-2009 13:05 » |
|
какие мтоды ты можешь предложить сам?
никаких, просто думал, что кто-нибудь использовал в практике какой нить таймер или какой нить регистр-счетчик процессора( если такой есть )
|
|
|
Записан
|
1n c0de we trust
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #5 : 28-07-2009 13:14 » |
|
RXL, у меня CLOCKS_PER_SEC получился 1000, есть какие нить методы точнее или придется функцию по 10**3-5 раз гонять?
|
|
|
Записан
|
1n c0de we trust
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #6 : 28-07-2009 13:15 » |
|
|
|
|
Записан
|
1n c0de we trust
|
|
|
Sla
|
|
« Ответ #7 : 28-07-2009 13:18 » |
|
тик = 1 прерывание системного таймера (приблизительно = 1/18 сек)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 28-07-2009 13:40 » |
|
Тот метод я привел как рекомендованный в документации к glibc. Возможен другой метод - получить время в микросекундах (или наносекундах) до и после.
Методов множество. Сами ОС имеют возможность учитывать использованное процессорное время - можно и в эту сторону посмотреть.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #9 : 28-07-2009 13:48 » |
|
Тот метод я привел как рекомендованный в документации к glibc. Возможен другой метод - получить время в микросекундах (или наносекундах) до и после.
Методов множество. Сами ОС имеют возможность учитывать использованное процессорное время - можно и в эту сторону посмотреть.
в простых процессорах вроде имеется регистр отсчитывающий такты процессора, в х86 такой есть? можно про нано\микросекунды поподробнее, если кто пользовался? ... а то я не знаю как правильно запрос сформировать
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 28-07-2009 14:46 » |
|
Есть такое. Только в user space это бессмысленно. Корректно затраченное процессорное время может подсчитать только ОС, т.к. она имеет возможность учитывать переключение задач. Взяв как пример тот же Linux, скажу, что там такой счетчик используется. Появился он то ли в процессорах Pentium, то ли в Pentium Pro - т.е., есть во всех современных процессорах x86.
По части точного времени, см.:
1. struct timeval и gettimeofday() в <sys/time.h>. 2. stuct tms и times() в <sys/times.h> 3. struct rusage, getrusage() и vtimes() в <sys/resource.h>
|
|
« Последнее редактирование: 28-07-2009 14:59 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #11 : 29-07-2009 04:00 » |
|
Есть такое. Только в user space это бессмысленно. Корректно затраченное процессорное время может подсчитать только ОС, т.к. она имеет возможность учитывать переключение задач
Не могу с тобой полностью согласится. Подсчёт тиков или тактов процессора, часто вполне приемлимый способ для анализа производительности в большинстве случаев, только при таком подходе нужно, что бы машина была по возможности нагружена только твоим софтом и нужно выполнять тест достаточно продолжительное время. я постоянно пользуюсь подобным подходом и он вполне подходит для поиска узких мест, конечно я иногда профилеровщик включаю в режим, когда он начинает выдавать время проведённое в ядре и в пространстве пользователя отдельно, но бывает это крайне редко, кроме того подобная проверка на Windows довольно прожорлива, НО (всегда есть но ) на линуксе ситуация меняется в линуксе быстрее работает метод предоставляющий отдельно данные о пользовательском пространстве и пространстве ядра, чем метод который просто возвращает тики ну и на конец сверх быстрая операция получения тактов http://ru.wikipedia.org/wiki/RdtscЗамечательная вещь, но ( опять оно ) как только вы переползаете на много ядерную систему.... бугага то вы не можете гарантировать, что полученные для сравнения такты при входе в функцию и при выходе сняты с одного и того же процессора, в большинстве случаев процессор одни (об этом заботится планировщик), но если вы не привязали процесс к конкретному ядру, то уж извините но зато операция быстрая и дешевая
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 29-07-2009 05:40 » |
|
а я как-то ::GetTickCount() всегда применял. Это отличается ?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 29-07-2009 05:59 » |
|
LogRus, вот-вот - надежность такого подхода такая же, как и многопоточный доступ к объектам без блокировок: может прокатить, а может и непредсказуемый результат получиться.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #14 : 29-07-2009 06:27 » |
|
RXL, ну есть свои минусы получение тиков меня устраивает в любом коде. Проверено не однократно - это работает так как лично мне нужно Алексей1153++, смотря отчего из не самопального рекомендую посмотреть в сторону valgrind, VTune и всеми любимый gprof конечно.
|
|
|
Записан
|
Странно всё это....
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #15 : 29-07-2009 11:36 » |
|
как я понимаю, для ее использования требуется, чтобы время проведенное в функции было заведомо меньше частот работы планировщика? какие накладки в случае вытесняющей многозадачности? как отсеивал переключение потоков\задач?
|
|
|
Записан
|
1n c0de we trust
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #16 : 29-07-2009 11:41 » |
|
а я как-то ::GetTickCount() всегда применял. Это отличается ?
тот же clock_t измеряющий время в милисекундах
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #17 : 29-07-2009 19:43 » |
|
Mayor, если ты прочел внимательно, используется 64-битный счетчик. Давай подсчитаем, сколько времени нужно для переполнения на 3 ГГц процессоре:
18446744073709551616 / 3000000000 = 6148914691.2365172053333333333333
194 года 309 дней и еще будет немного времени, чтобы перекурить и поспать.
P.S.: вот и не говори, после таких примитивных расчетов, что ты знаешь тему. Верхи хватаешь, но спецом тебе не быть...
RTFM, блин... Или переходи в коммерсанты - там такие нужны.
|
|
« Последнее редактирование: 29-07-2009 19:48 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #18 : 30-07-2009 03:28 » |
|
как я понимаю, для ее использования требуется, чтобы время проведенное в функции было заведомо меньше частот работы планировщика? какие накладки в случае вытесняющей многозадачности? как отсеивал переключение потоков\задач?
На это всё кладётся болт в большинстве случаев RXL, поддерживаю
|
|
|
Записан
|
Странно всё это....
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #19 : 01-08-2009 02:28 » |
|
Mayor, если ты прочел внимательно, используется 64-битный счетчик. Давай подсчитаем, сколько времени нужно для переполнения на 3 ГГц процессоре:
если бы ты прочитал до конца, то увидел, что в этом счетчике используется таймер равный 1 мс мне вот любопытно, почему ты не начал расчеты с 32 битного счетчика? если бы его вначале обсчитал, то заметил, что в некоторых долгоиграющих приложениях с таймером в 1мс, происходит его переполненим, имхо, в связи с чем и ввели 64 битный
|
|
« Последнее редактирование: 01-08-2009 03:16 от Mayor »
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #20 : 01-08-2009 03:54 » |
|
Mayor, где такую траву берешь? Мы серьезно обеспокоены твоим здоровьем. http://ru.wikipedia.org/wiki/RdtscГде ты тут нашел "1 мс"? Какие, XXX, приложения?! Это сам процессор считает!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #21 : 01-08-2009 05:48 » |
|
Mayor, где такую траву берешь? Мы серьезно обеспокоены твоим здоровьем. http://ru.wikipedia.org/wiki/RdtscГде ты тут нашел "1 мс"? Какие, XXX, приложения?! Это сам процессор считает! ты бы 4мя темами выше уточнил, что приводишь расчеты для исползования для rdtsc, а не для 64 битной версии GetTickCount ... простой конфликт терминов
|
|
|
Записан
|
1n c0de we trust
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #22 : 01-08-2009 07:06 » |
|
Mayor, GetTickCount ... ничего сам не считает. А просто поднимает данные о количестве тиков. Так что тут нет никакого конфликта терминов. А твое не понимание. И не хотение понять.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #23 : 30-08-2009 16:42 » |
|
че то полез читать описание rdstc инструкции и нашел замечание о том, что в связи с произвольным выполнением команд процессора возможно считывание счетчика до того, как выполнены предшествующие ей комманды - и ссылку на rdtscp:
якобы эта инструкция выполняет серилизацию перед тем как считать значение счетчика
кто-нить ей пользовался?
зачем ей ссылка на ячейку памяти?
где можно найти ее описание и какие процессоры ее поддерживают?
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #24 : 30-08-2009 18:34 » |
|
Mayor, обратись к документации на сайте Intel.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #25 : 31-08-2009 12:26 » |
|
Mayor, обратись к документации на сайте Intel.
у меня амд стоит, скачал 3й том, но там такой команды не нашел
|
|
|
Записан
|
1n c0de we trust
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #26 : 31-08-2009 12:38 » |
|
А она у тебя отрабатывается? Если да, значит плохо искал. Иши лучше.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #27 : 01-09-2009 12:26 » |
|
А она у тебя отрабатывается? Если да, значит плохо искал. Иши лучше.
да мне бы вначале найти ее описание, как я понял она вроде: Added with x86-64 : RDTSCP (ReaD Time Stamp Counter and Processor ID) или наверное будет проще считать cpuid, а потом применить rdtsc
|
|
|
Записан
|
1n c0de we trust
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #28 : 01-09-2009 12:27 » |
|
На моей памяти в описание тебя носом тыкали не меньше четрыех раз. Забываеш, записывай в блокнотик. На худой конец гугль изобрели в 1996 году еше. И его еше никто не отменял.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #29 : 01-09-2009 12:31 » |
|
На моей памяти в описание тебя носом тыкали не меньше четрыех раз. Забываеш, записывай в блокнотик. На худой конец гугль изобрели в 1996 году еше. И его еше никто не отменял.
ты rdtsc с rdtscp не путаешь?
|
|
|
Записан
|
1n c0de we trust
|
|
|
|