|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.03.2019, 13:28 | #1 |
Регистрация: 09.06.2018
Сообщений: 9
|
Время выполнения функций
Как узнать время выполнения написанной мной функции?
|
29.03.2019, 13:36 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Запустите всб вашу программу в реальном сценарии под профилировщиком и посмотреть. Это если вам реально надо, а если поиграться, то: сами замеряйте время до и после, используйте готовые бенчмарки и т.д.
|
05.04.2019, 11:20 | #3 |
Новичок
Джуниор
Регистрация: 05.04.2019
Сообщений: 2
|
Дарю!
Пользоваться следующим образом:
Делаете свои функции, чтобы они принимали лишь один аргумент (можете, в принципе, изменить) Делаете экземпляр TestSystem, вызываете operator()(fun1, arg1, n) или operator()(fun1, arg1, fun2, arg2, n, nn) - первый метод возвращает double (одна миллисекунда), второй структуру Result, в которой: * first - время выполнения в миллисекундах первой функции * second - также, но для второй * ratio = first/second * n (аргумент operator()) - количество повторений выполнения функции в тесте(время иначе будет слишком маленьким) * nn (аргумент второго operator()'а) - количество повторений тестов (результаты можно получить в открытом члене results). Вроде всё написал... Если есть вопросы - задавайте. Там ещё внизу Stopwatch.hpp Код:
|
29.06.2019, 20:08 | #4 |
Пользователь
Регистрация: 26.09.2018
Сообщений: 23
|
В начале функции:
time_t start = clock(); В конце: time_t end() = clock(); std::cout << (end - start) / CLOCKS_PER_SEC << std::endl; |
30.06.2019, 18:23 | #5 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
1. Засечь время старта.
2. Организовать цикл, в котором N раз выполнится заданная функция. 3. Засечь время финиша. 4. Вычесть и разделить. Получим приблизительное время (не учтены накладные расходы на выполнение самого цикла) . Если нужно точнее, то отдельно измерить время выполнения пустого цикла (выключить оптимизацию, чтобы пустой цикл компилятор вообще не выбросил) . А точное время и не нужно, потому что при работе в реальной среде будет еще расход времени на функции операционной системы. |
02.07.2019, 13:09 | #6 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
смазанный эффектом прогретой памяти. Цитата:
шум на микросхемах? тестить дебаг - мсье знает толк в извращениях. |
||
02.07.2019, 13:47 | #7 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
Кто из нас мсье - это еще вопрос. Измеряя время "цикл + выполняемая функция" минус "чисто цикл", определяем чистое время выполнения N раз функции. И я не утверждал, что получим точное значение - оно невозможно в принципе. И каким боком тут "шум на микросхемах" ? Я измеряю это на ламповой "Урал-4"
Непонятно, почему такой простой и логичный метод вызывает такое отторжение. В давние времена, когда я делал реалтаймовый измерительный комплекс на СМ-4, этим способом спокойно настроились все критичные времянки - я же тогда не знал, что "так нииизя!" А насчет "прогретой памяти" - это для меня открытие. Случаем, не путаешь с прогревом шин в Формуле-1 ? А вообще говорить о времени выполнения функции в многозадачной системе можно только очень приблизительно. Сильно зависит от того, в каком контексте работает функция. Да и если брать чистое время выполнения - без ОС, только она - результаты могут плавать +- лапоть в зависимости от аргументов. Возьмем, к примеру, сортировку пузырьком и подсунем ей массив отсортированный, а потом - "анти-отсортированный" - отличие будет не в десятках процентов, а в разы. Так что можно лишь оценить - функция работает сотни микросекунд или десятки миллисекунд. Последний раз редактировалось digitalis; 02.07.2019 в 14:04. |
02.07.2019, 16:30 | #8 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
гуглить что-нибудь типа benchmarking warmup, microbenchmarking warmup
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
02.07.2019, 19:59 | #9 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
пример: (оригинал гуглится: std::shared_ptr БЫСТРЕЕ обыкновенного указателя?) http://ideone.com/7zvVjP Код:
Код:
что тяжеловесный shared pointer работает быстрее, чем легковесный standard pointer поменяешь местами циклы, и показания сразу меняются. http://ideone.com/tzPZQR Код:
современные камни - сложные штуки. кэши разных уровней, механизм предсказаний, и тп. в народе говорят: "холодный старт память прогрел" поэтому, если ты хочешь замерить работу функции, а не шум на микросхемах, бенчмарк готовить нужно грамотно. на самом деле годный бенчмарк - это целая наука. но есть два фундаментальных правила: 1. тестить нужно релиз со всеми оптимизациями. 2. каждый тест - отдельный запуск отдельного приложения. что бы минимизировать эффект гретой памяти. Последний раз редактировалось _Bers; 02.07.2019 в 20:04. |
|
02.07.2019, 21:59 | #10 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
Вот оно как... Значит, подзадержался я в прошлом тысячелетии. Век живи - век учись. Хорошо, что моя старушка СМ-4 в те времена не знала таких тонкостей, а то сказала бы: "Выключай кулеры, щас мегафлопсы выдавать буду".
Мир сложнее, оказывается, чем он есть на самом деле. Последний раз редактировалось digitalis; 02.07.2019 в 22:06. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Время выполнения алгоритма | imbaTapac | Общие вопросы C/C++ | 3 | 06.06.2015 20:08 |
Скрытие выполнения Api функций | LomoCoder | Общие вопросы Delphi | 10 | 26.01.2014 03:30 |
выполнения функций JS | slikNET | JavaScript, Ajax | 0 | 19.02.2013 12:00 |
Время выполнения | n00n | Общие вопросы C/C++ | 7 | 10.06.2010 15:05 |
Время выполнения | Goodwin98 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 16 | 21.06.2009 08:41 |