| Как сделать свою программу быстрой 10.06.2003 Андрей Гапанович
Теперь самый важный вопрос — в каких местах оптимизировать код. Если оптимизировать всю программу, на это уйдет очень много времени и большая часть труда будет потрачена впустую. Оптимизировать нужно именно те участки, которые более всего тормозят общую производительность. Для их определения используются профайлеры. Профайлер — это программа или модуль, который засекает время и частоту выполнения отдельных участков программы и дает возможность программисту проанализировать эти сведения. Профайлеры существуют для многих языков и зачастую входят в состав самих систем программирования. Работу с профайлером я рассмотрю на примере Delphi, как наиболее распространенной на просторах бывшего Советского Союза системы программирования. Встроенный профайлер в Delphi отсутствует, зато существуют профайлеры сторонних разработчиков. Вот некоторые из них: - ProDelphi (www.prodelphi.de), GpProfile представляет собой модуль gpprof.pas и исполняемый файл gpprof.exe. Прежде всего, необходимо открыть проект, «узкие» места которого мы будем искать. GpProfile просканирует все модули вашего проекта и отобразит все их функции, процедуры и методы. Далее от вас требуется отметить те процедуры и функции, которые вы собираетесь исследовать (рис. 1). Можно, конечно, выбрать все, но тогда будет гораздо сложнее разбираться в результатах тестирования. Если вы хотите улучшить производительность какого-то определенного действия пользователя, то отметьте именно те функции, которые связаны с этим действием. Следующим шагом следует выбрать пункт меню Project/Instrument. При этом GpProfile изменит модули вашего проекта, в которых встречаются отмеченные функции, создав при этом резервную копию исходного кода. Изменения сводятся к следующему: - В начале каждой процедуры, функции или метода добавляется {>>GpProfile} ProfilerEnterProc(1); try {GpProfile>>}. С помощью вызова ProfilerEnterProc засекается начало выполнения процедуры. В качестве аргумента выступает номер, уникальный для каждой функции. - В конце каждой функции добавляется {>>GpProfile} finally ProfilerExitProc(6); end; {GpProfile>>}. Здесь засекается время завершения работы функции. После завершения работы программы накопленная информация обрабатывается и показывается в окне exe-модуля GpProfile (рис. 2). Статистику можно анализировать по модулям, классам, процедурам. Для каждой процедуры можно узнать следующие статистические данные: - Time — общее время, в течение которого работала процедура; Теперь у нас есть информация о том, какие участки кода работают долго и какие вызываются чаще других. Оптимизации этих процедур стоит уделить наибольшее внимание. Следует отметить недостаток этого профайлера — нельзя размещать метки в произвольных местах, поэтому если вы хотите подробнее исследовать работу достаточно длинной процедуры, придется разбить ее на более мелкие. После изменения кода запускайте профайлер снова, смотрите, какая процедура теперь «съедает» больше всего времени, оптимизируйте ее и так до тех пор, пока не добьетесь удовлетворительной скорости. Для каждой программы существует определенный предел, преодолеть который не удастся, применяя даже самые изощренные способы оптимизации. Но все же с помощью описанной методики обычно удается существенно повысить скорость работы, а иногда и вовсе избавиться от медлительности программы. После завершения оптимизации уберите метки, которые вставил в код GpProfile. Для этого выберите пункт меню Project/Remove instrumentation, и ваш код примет исходный вид. Но изменения, произведенные вами для повышения быстродействия, конечно же, останутся.
|