C++ Измерение времени функций
Мне нужно измерить время программ на C++, особенно общее время выполнения некоторых рекурсивных функций. Внутри других функций есть много вызовов функций. Моей первой мыслью было реализовать некоторые функции измерения времени в реальном коде.
Проблема с gprof состоит в том, что он печатает время операторов класса для типа данных, но мне нужно только информационное описание функций, и "-f func_name prog_name" не будет работать.
Итак, что является наиболее распространенным в науке способом измерения времени числовой программы?
Это примерно так:
function2()
{
}
function1()
{
function2();
funtcion1();
}
int main(){
function1();
}
2 ответа
Если вы используете пакет GNU, т.е. gcc, вы можете попробовать gprof. Просто скомпилируйте вашу программу с флагами -g и -pg, а затем запуститеgprof <your_program_name>
gprof: http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html
РЕДАКТИРОВАТЬ: Для повышения уровня детализации вы можете запустить gprof с другими флагами:
-l (--line) разрешает построчное профилирование, давая вам хиты гистограммы, которые будут начисляться на отдельные строки кода, а не на функции.
-a Не включать частные функции в вывод.
-e <function>
Исключить вывод для функции <function>
, Используйте это, когда есть функции, которые не будут изменены. Например, на некоторых сайтах есть исходный код, который был одобрен регулирующим органом, и независимо от того, насколько он неэффективен, код останется неизменным.
-E <function>
Также исключите время, потраченное на функцию из процентных таблиц.
-f <function>
Противоположность -e: только отслеживать время в <function>
,
-F <function>
Используйте только время в <function>
при расчете процентов.
-b Не печатать пояснительный текст. Если вы более опытны, вы можете оценить этот вариант.
Накопить образцы. Запустив программу несколько раз, можно получить более четкое представление о том, где тратится время. Например, медленная процедура может быть вызвана не для всех входных значений, и, следовательно, вы можете ввести в заблуждение чтение, где можно найти проблемы с производительностью.
Если вам нужна более высокая точность (для функций, которые не занимают более нескольких (или менее) миллисекунд), вы можете использовать std::chrono::high_resolution_clock
:
auto beginT = std::chrono::high_resolution_clock::now();
//Your computation here
auto endT = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(endT - beginT).count()
std::chrono::high_resolution_clock
можно найти в chrono
заголовок и является частью стандарта C++11.