Я хочу узнать, сколько времени требуется в моей программе на C ++ для выполнения определенной функции в Linux . После этого я хочу провести сравнение скорости. Я видел несколько функций времени, но закончил с этим из-за повышения. Chrono:
process_user_cpu_clock, captures user-CPU time spent by the current process
Теперь мне не ясно, использую ли я вышеуказанную функцию, получу ли я единственное время, которое процессор потратил на эту функцию?
Во-вторых, я не смог найти ни одного примера использования вышеуказанной функции. Может ли кто-нибудь помочь мне, как использовать вышеуказанную функцию?
PS: Сейчас я использую, std::chrono::system_clock::now()
чтобы получить время в секундах, но это дает мне разные результаты из-за разной загрузки процессора каждый раз.
c++
optimization
profiling
Xara
источник
источник
clock_gettime
.. gcc определяет другие часы как:typedef system_clock steady_clock; typedef system_clock high_resolution_clock;
в Windows используйтеQueryPerformanceCounter
.Ответы:
Это очень простой в использовании метод в C ++ 11. Вы должны использовать
std::chrono::high_resolution_clock
из<chrono>
заголовка.Используйте это так:
Это позволит измерить продолжительность функции.
ПРИМЕЧАНИЕ. Вы не всегда получите одинаковое время для функции. Это связано с тем, что ЦП вашего компьютера может меньше или больше использоваться другими процессами, запущенными на вашем компьютере, точно так же, как ваш ум может быть более или менее сконцентрирован, когда вы решаете математическое упражнение. В человеческом уме мы можем вспомнить решение математической задачи, но для компьютера один и тот же процесс всегда будет чем-то новым; таким образом, как я уже сказал, вы не всегда будете получать одинаковый результат!
источник
high_resolution_clock
даст вам физическое и реальное время, необходимое для выполнения вашей функции. Итак, при первом запуске ваш процессор использовался меньше, чем при следующем запуске. Под «использованным» я имею в виду, какие другие приложения используют ЦП.steady_clock
? Разве неhigh_resolution_clock
могут быть немонотонные часы?Вот функция, которая будет измерять время выполнения любой функции, переданной в качестве аргумента:
Пример использования:
Вывод:
источник
high_resolution_clock
может быть псевдонимомsystem_clock
(настенные часы)steady_clock
или третьими независимыми часами. Подробности смотрите здесь . Для часов процессораstd::clock
можно использоватьwindows.h
в нетривиальный проект c ++. Касательноassert
прежде всего: "quod licet iovi non licet bovi";). Во-вторых, не все решения в стандартной библиотеке (иногда датируемые десятилетиями) на самом деле считаются хорошей идеей по современным стандартам. Есть причина, по которой разработчики модулей C ++ очень стараются не экспортировать макросы по умолчанию.простая программа для определения времени выполнения функции.
источник
В книге Скотта Мейерса я нашел пример универсального обобщенного лямбда-выражения, которое можно использовать для измерения времени выполнения функции. (C ++ 14)
Проблема в том, что вы измеряете только одно выполнение, поэтому результаты могут сильно отличаться. Чтобы получить достоверный результат, следует замерить большое количество исполнений. Согласно лекции Андрея Александреску на конференции code :: dive 2015 - Writing Fast Code I:
Измеренное время: tm = t + tq + tn + to
где:
tm - измеренное (наблюдаемое) время
t - актуальное интересующее время
tq - время, добавленное шумом квантования
tn - время, добавленное различными источниками шума
to - время накладных расходов (измерение, цикл, вызов функций)
Согласно тому, что он сказал позже в лекции, вы должны принять как минимум это большое количество казней в качестве результата. Я рекомендую вам посмотреть лекцию, в которой он объясняет почему.
Также есть очень хорошая библиотека от Google - https://github.com/google/benchmark . Эта библиотека очень проста в использовании и мощна. Вы можете просмотреть некоторые лекции Чендлера Каррута на YouTube, где он использует эту библиотеку на практике. Например, CppCon 2017: Чендлер Каррут «Быстрее никуда не денешься»;
Пример использования:
РЕДАКТИРОВАТЬ: Конечно, вам всегда нужно помнить, что ваш компилятор может что-то оптимизировать или нет. В таких случаях могут быть полезны такие инструменты, как perf.
источник
Простой способ для более старого C ++ или C:
Точность отсчета времени в секундах составляет
1.0/CLOCKS_PER_SEC
источник
Например, чтобы найти все простые числа от 1 до 100 миллионов, требуется примерно 1 минута 40 секунд. Таким образом, время выполнения печатается как:
Код здесь:
источник
Вот отличный шаблон класса только для заголовков для измерения прошедшего времени функции или любого блока кода:
Вот некоторые его применения:
Поскольку класс является шаблоном, мы можем легко указать, как мы хотим, чтобы наше время измерялось и отображалось. Это очень удобный шаблон служебного класса для выполнения тестов производительности, который очень прост в использовании.
источник
stop()
функция-член не нужна, потому что деструктор останавливает таймер за вас.test code
запуском таймера. Затем после вашегоtest code
вы явно используете объект таймера и вызываете его метод остановки. Вы должны вызывать его вручную, когда хотитеstop
использовать таймер. Класс не принимает никаких параметров. Кроме того, если вы использовали этот класс так же, как я показал, вы увидите, что между вызовомobj.stop
и его вызовом проходит минимальное времяdestructor
.<chrono>
?Я рекомендую использовать,
steady_clock
который гарантированно будет монотонным, в отличие отhigh_resolution_clock
.Вывод:
источник
У вас может быть простой класс, который можно использовать для такого рода измерений.
Единственное, что нужно сделать, это создать объект в вашей функции в начале этой функции.
и это все. Класс можно изменить в соответствии с вашими требованиями.
источник
Поскольку ни один из предоставленных ответов не является очень точным и не дает воспроизводимых результатов, я решил добавить ссылку на свой код, который имеет субнаносекундную точность и научную статистику.
Обратите внимание, что это будет работать только для измерения кода, выполнение которого занимает (очень) короткое время (то есть от нескольких тактовых циклов до нескольких тысяч): если они работают так долго, что они могут быть прерваны каким-либо -heh- прерыванием , то явно невозможно дать воспроизводимый и точный результат; Следствием этого является то, что измерение никогда не заканчивается: а именно, оно продолжается до тех пор, пока не будет статистически на 99,9% уверено, что он имеет правильный ответ, чего никогда не происходит на машине, на которой выполняются другие процессы, когда код занимает слишком много времени.
https://github.com/CarloWood/cwds/blob/master/benchmark.h#L40
источник
Если вы хотите сэкономить время и строки кода, вы можете сделать измерение времени выполнения функции однострочным макросом:
а) Реализуйте класс измерения времени, как уже предлагалось выше (вот моя реализация для Android):
б) Добавьте удобный макрос, который использует текущее имя функции как ТЕГ (использование макроса здесь важно, иначе
__FUNCTION__
будет вычислятьсяMeasureExecutionTime
вместо функции, которую вы хотите измеритьc) Напишите свой макрос в начале функции, которую вы хотите измерить. Пример:
Это приведет к следующему выводу:
Обратите внимание, что это (как и все другие предлагаемые решения) будет измерять время между вызовом вашей функции и ее возвратом, а не обязательно время, когда ваш процессор выполнял функцию. Однако, если вы не дадите планировщику никаких изменений для приостановки вашего работающего кода, вызвав sleep () или аналогичный, нет никакой разницы между.
источник