Замеры времени и профилирование
Автоматизируйте замеры времени. В большинстве систем существуют команды, позволяющие выяснить, сколько времени работала программа. В Unix такая команда называется time:
Эта команда запускает программу и возвращает три числа, означающих время в секундах: время real – физическое время, израсходованное до завершения работы программы; время user – время процессора, потраченное на исполнение самой программы; время sys – время, потраченное на программу операционной системой. Если в вашей системе есть аналогичная команда, используйте ее – числа будут более информативными и надежными, и делать отсчеты будет проще, чем при использовании секундомера.
Ведите подробные записи. При работе над программой – внесении модификаций и/или проведении измерений – у вас накопится огромное количество данных, в которых вам будет трудно разобраться по памяти уже через день-два. (Какая именно версия работает на 20% быстрее?) Многие технологии, которые мы обсуждали в главе о тестировании, могут быть адаптированы и к измерениям времени и улучшению производительности. Используйте компьютер для запуска набора тестов и измерения времени их работы, а самое главное – используйте регрессивное тестирование, чтобы удостовериться в том, что "улучшения" производительности не нарушили корректности программы.
Если в вашей системе нет команды time или вы хотите замерить время работы отдельно взятой функции, не так трудно создать себе оснастку для таких замеров – по аналогии с тестовой оснасткой. В С и C++ существует стандартная функция clock, которая сообщает, сколько процессорного времени программа использовала до текущего момента. Ее можно вызвать перед интересующей вас функцией и после нее и таким образом вычислить время ее исполнения процессором:
Масштабирующий коэффициент CLOCKS_PEfi_SEC характеризует разрешение таймера, возвращаемое clock. Если функция выполняется за доли секунды, запустите ее в цикле, но (если измерения должны быть особо точными) не забудьте компенсировать затраты времени на сам цикл:
В Java функции класса Date выдают текущее системное время, которое приблизительно равно времени, использованному процессором:
Значение, возвращаемое getTime, измеряется в миллисекундах.