Как сделать свою программу быстрой
 
10.06.2003
Андрей Гапанович


 
стр. 1
стр. 2 >>

В те далекие времена, когда компьютеры были не быстрее черепахи, многие программисты писали свои творения, буквально вылизывая каждую строку кода, чтобы хоть немного повысить скорость работы программ. С развитием аппаратной части быстродействие компьютеров стремительно росло и за последнее десятилетие увеличилось на порядки. Обычный персональный компьютер сейчас в разы превосходит вычислительной  большие ЭВМ советских времен, занимавшие целые комнаты. Такое положение дел разбаловало программистов, особенно начинающих, — ведь типичные приложения зачастую используют менее десяти процентов ресурсов процессора. Может, оптимизация кода и вовсе не нужна? Конечно, приятно сознавать, что твой код совершенен, но если никто, кроме тебя самого, этого не оценит, стоит ли тратить время? Тем более что программист, как правило, работает в жесточайшем цейтноте. Нужна ли оптимизация ради оптимизации, и нельзя ли во многих случаях обойтись без нее?

Чтобы определить, нужна ли оптимизация кода, надо протестировать программу на том компьютере, где она будет работать (или на аналогичном по конфигурации). Если на глаз заметны всевозможные задержки, паузы и ожидания, то оптимизация не помешает. Если эти задержки продолжительны, то оптимизация необходима. Если же программа будет работать на большом количестве компьютеров, то для тестирования следует выбрать самый медленный из них. Если программа распространяется среди большого числа пользователей и заранее неизвестно, какие у них компьютеры, я бы советовал узнать минимальную конфигурацию, которую еще можно купить, и ориентироваться на нее. Если человек пользуется устаревшим компьютером, значит, он морально готов к тому, что некоторое программное обеспечение будет работать медленно.

В некоторых случаях оптимизация необходима даже без всяких тестирований. К ним можно отнести написание библиотек и драйверов, программ, выполняющих сложные математические преобразования, например mpeg-кодирование, распознавание текста. Необходимость оптимизации библиотек обусловлена тем, что, помимо кода самой библиотеки, нагрузку на процессор будет создавать и программа, использующая эту библиотеку. В этом смысле драйверы немного похожи на библиотеки. Их функции тоже используются другим кодом. Но стоит заметить, что драйверы, как правило, имеют высокий приоритет в операционной системе, и если код драйвера будет работать медленно, это сильно скажется на быстродействии всей системы. Существует много программ, которые занимаются сложными математическими преобразованиями. Даже при нынешних вычислительных возможностях их работа занимает много времени, и ускорение даже на несколько десятков процентов дает ощутимую экономию времени, особенно если эти программы используются часто.

1Итак, мы решили, что программа работает недопустимо медленно и надо постараться ускорить ее работу. Как этого достичь? Наибольший эффект, как правило, дает замена медленных алгоритмов более быстрыми. Возьмем классический пример — поиск. Предположим, у нас есть список строк, и мы ищем среди них нужную. Когда строк не много, проще всего последовательно перебирать их, пока не найдется нужная. Когда строк около тысячи, потребуется в среднем около пятисот сравнений. Но если список предварительно отсортировать и применить бинарный поиск, то можно обойтись в среднем десятком сравнений. То есть получаем увеличение скорости работы в пятьдесят раз. И чем больше строк в списке, тем больше выигрыш в скорости.

2Если вы используете в своей программе сторонние библиотеки (а так бывает практически всегда, поскольку на сегодняшний день нереально писать программы, не используя хотя бы функции системных библиотек), может оказаться, что в медлительности программы виновата именно чужая библиотека. Ее ведь тоже писали программисты, которые могли отложить оптимизацию на более поздний срок или вовсе про нее забыть. Тогда стоит поискать другие библиотеки, выполняющие те же функции, или даже попробовать реализовать их самим. Самостоятельная реализация нужных функций может дать эффект, если вы используете лишь небольшую часть сложной библиотеки. В таких библиотеках все функции часто взаимосвязаны, и при вызове одной из них может вызываться большое количество других вспомогательных функций, которые вам совершенно не нужны. Именно за счет этого можно увеличить быстродействие. Если вы используете всю мощь библиотеки, не пытайтесь писать ее самостоятельно. Во-первых, это отнимет очень много времени, во-вторых, при ее реализации можно столкнуться с множеством проблем, которые давным-давно решены. Лучше обратить внимание на аналогичные библиотеки других разработчиков.

Повысить быстродействие можно и учитывая особенности процессора. Например, используя дополнительные инструкции из наборов MMX, 3DNow, 3DNowEx, SSE, SSE2, можно значительно ускорить обработку мультимедийных данных, распознавание текста и т. п. Так, обнулить регистр можно следующими способами:

- sub ax,ax;
- mov ax,0;
- xor ax,ax.

Третий вариант — самый быстрый, а два других гораздо медленнее. Конечно, если эта инструкция выполняется единожды, разницы никто не заметит. А если это происходит в цикле, который вызывается миллионы раз, то она вполне ощутима, особенно если подобные изменения сделать не в одном месте. К счастью, многие компиляторы сейчас имеют возможность оптимизации, и такие процессорные нюансы учитываются ими автоматически. Хотя думать «по-человечески» никакие автоматические оптимизаторы не умеют, и не помешает глянуть, какой код они генерируют. В некоторых случаях вообще целесообразно отдельные участки писать на ассемблере, так как код получается компактнее и быстрее, чем сгенерированный компилятором.


 
стр. 1
стр. 2 >>

<<Двойной стандарт
Все материалы номера
События >>