Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей



  • На сайте

    РИД. П-образные рамные опоры на сайте с описанием и ценами. Под ключ.

    rid-road.ru


Ассемблер в среде Windows

Разработка высокоэффективного программного кода
Термин "оптимизаций" применительно к процессу разработки и отладки программ подразумевает улучшение каких-либо характеристик работы программного продукта. Под этим термином подразумевают часто и комплекс мер по улучшению показателей производительности программы.
Сам процесс оптимизации программного обеспечения может выполняться как программистом {ручная оптимизация), так и в автоматическом режиме компилятором той среды разработки, в которой производится отладка приложения. Возможен и вариант, когда программист использует программу- отладчика третьей фирмы для выполнения отладки и оптимизации.

Большинство разработчиков понимает, что в условиях жесткой конкуренции вопрос производительности является важнейшим условием успеха или неудачи программы на рынке программных продуктов.
Без серьезной работы над улучшением производительности программного кода нельзя обеспечить конкурентоспособность приложения. Хотя все осознают необходимость и важность процесса оптимизации программного обеспечения, эта тема до сих пор является противоречивой и дискуссионной. Все споры вокруг этого процесса в основном затрагивают один вопрос: так ли уж необходимо программисту заниматься ручной оптимизацией своего" приложения, если для этого есть готовые аппаратно-программные средства?

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

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

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

Любая более или менее серьезная программа имеет столько взаимосвязанных параметров, что ни одно средство разработки не улучшит ее так, как это может сделать сам программист. Процесс оптимизации программ сродни скорее искусству, чем "чистому" программированию, и трудно поддается алгоритмизации.
Улучшение производительности программ — процесс обычно трудоемкий, занимающий значительную часть времени. Хочется отметить, что не существует единого критерия оптимизации. Более того, сам процесс оптимизации довольно противоречив. Например, если добиться уменьшения объема памяти, используемого программой, то за это придется расплатиться потерей быстродействия работы программы.

Ни одна программа не может быть одновременно сверхбыстрой, сверхмалой по размеру и полнофункциональной для пользователя. К этому можно сколь угодно приближаться, но идеального приложения вам получить никогда не удастся.
Хорошие программы обычно сочетают те или иные качества в разумных пропорциях, в зависимости от того, что важнее: скорость выполнения, размер программы (как файла приложения, так и объема памяти, занимаемого работающим приложением) или удобство интерфейса пользователя. Для многих офисных приложений очень важным показателем является удобство интерфейса пользователя и как можно более высокая функциональность. Например, для пользователя программы электронного телефонного справочника тот факт, что программа работает на 10% быстрее или медленнее, особого значения не имеет.
Размер такой программы, в принципе, не критичен и также не имеет особого значения, т. к. объем современных жестких дисков достаточно большой, чтобы поместить десятки и даже сотни таких электронных справочников. Программе может быть необходимо десятки мегабайт оперативной памяти для работы — это тоже сейчас не проблема. Но вот возможность удобной манипуляции данными для пользователя будет очень важной.

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

Приложения, работающие в режиме реального времени, критичны по синхронизации получения, обработки и, возможно, передачи данных за приемлемые интервалы времени. Подобные программы требуют, как правило, оптимизации по загрузке процессора и синхронизации с системными службами операционной системы. Если вы — системный программист и разрабатываете драйверы или сервисы для работы с операционной системой, например с Windows 2000, то неэффективный программный код в лучшем случае только замедлит работу всей операционной системы, а о худших последствиях можно только догадываться.
Как видим, повышение производительности программ зависит от многих факторов и в каждом конкретном случае определяется тем, что эта программа должна делать.
Рассмотрим теперь более подробно, как можно выполнить оптимизацию программ, и проведем небольшой сравнительный анализ различных методов повышения производительности выполнения приложений.
Простейший способ заставить приложения работать быстрее — это повысить вычислительную мощь компьютера за счет установки более производительного процессора или увеличения объема памяти, т. е. сделать апгрейд (upgrade) аппаратной части. В этом случае проблема производительности будет решена сама собой.

Если вы сторонник такого подхода, то скорей всего окажетесь в тупике, т. к. будете все время зависеть от аппаратных решений. К слову сказать, многие ожидания насчет производительности новых поколений процессоров, новых типов памяти и архитектур системных шин оказываются явно преувеличенными. Их производительность на практике оказывается ниже задекларированной фирмами-изготовителями. Так, например, новые микросхемы памяти, как правило,.превосходят своих предшественников по объему хранимых данных, но отнюдь не по быстродействию. Производительность жестких дисков также растет медленнее, чем их объем.

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

Оптимизация может проводиться по следующим направлениям:
1. тщательная проработка алгоритма разрабатываемой программы;
2. учет существующих аппаратных средств компьютера и использование их оптимальным образом;
3. использование средств языка высокого уровня той среды, в которой разрабатывается приложение;
4. использование языка низкого уровня ассемблера;
5. учет специфических особенностей процессора.
Рассмотрим более подробно каждое из этих направлений.





Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru