Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework
■ Можно ли исключить или сократить периоды задержек путем технической доработки проекта?
■ Можно ли обрабатывать задержки, вызывая заставки или отображая курсоры ожидания, уведомляющие пользователя о том, что выполнение приложения продолжается?
■ Можно ли передать выполнение задачи фоновому потоку, чтобы обеспечить сохранение пользовательским интерфейсом постоянной способности к отклику?
Абсолютная производительность критических алгоритмовСреди алгоритмов, используемых в вашем приложении, всегда можно выделить ключевые алгоритмы, влияние которых на восприятие пользователем условий работы с приложением является определяющим. Таковыми являются алгоритмы, ответственные за выполнение наиболее важных функций приложения. К числу подобных алгоритмов относятся загрузка данных из баз данных, синтаксический анализ содержимого файлов, расчеты графиков для отображения их на устройстве или генерация отчетов для представления данных пользователю. Так, если для рисования графика на основании собранных пользователем данных требуется три минуты, то этот промежуток времени является слишком большим даже при условии сохранения интерактивной связи пользователем с пользовательским интерфейсом на протяжении всего периода ожидания. О том, чтобы в процессе выполнения таких ключевых алгоритмов пользователь не испытывал никакого дискомфорта, вы должны позаботиться отдельно, призвав на помощь всю свою творческую смекалку.
К числу вопросов, на которые необходимо дать ответ, пересматривая критические алгоритмы, относятся следующие:
■ Можно ли ускорить выполнение этих алгоритмов путем их настройки или изменения?
■ Можно ли прогнозировать потребность алгоритмов в тех или данных и заблаговременно загружать нужные данные, прежде чем в них возникнет необходимость, чтобы пользователь мог быстрее получить результат?
■ Можно ли выполнять наиболее трудоемкую часть вычислений вне устройства, на сервере?
■ Можно ли произвести некоторые вычисления или подготовить некоторые изображения еще на стадии проектирования, чтобы исключить или уменьшить потребность в проведении соответствующих вычислений на стадии выполнения?
Все сказанное выше о ключевых этапах и производительности можно резюмировать следующим образом: установив для намеченных контрольных точек критерии завершения, учитывающие аспекты производительности, и сделав их соблюдение обязательным требованием процесса разработки, вы сможете гарантировать успешную разработку вашего программного проекта.
Время от времени критически пересматривайте написанный код
Замечательным способом улучшения качества создаваемого вами кода является его периодический критический анализ, направленный на обеспечение высокой производительности приложения. Хотя проектирование по соглашениям — не самая приятная стратегия построения алгоритмов, взаимный анализ кода, написанного разными участниками рабочей группы, является проверенным способом улучшения его качества. Критический анализ кода предоставляет преимущества двоякого рода
1. Выявление возможных путей улучшения алгоритмов. Как сам процесс подготовки к критическому анализу кода, так и непосредственный его анализ содействуют нахождению способов написания более эффективного кода и проектированию пользовательских интерфейсов, обладающих высокой интерактивностью.
2. Обмен опытом, извлечение уроков и лучшее знание кода, написанного партнерами. Примеры новых подходов к решению трудных проблем производительности, содержащиеся в анализируемом коде, становятся общим достоянием всех, кто принимает участие в его критическом разборе. Кроме того, каждый разработчик только выигрывает от того, что остальные члены группы будут глубже понимать принципы функционирования разработанных им компонентов приложения.
Чтобы взаимная критическая проверка кода приносила наибольшую пользу, целесообразно подготовить единые стандарты написания программ, которых должны придерживаться все члены группы. Использование общих механизмов реализации кода машин состояний кэширования ресурсов и пользовательского интерфейса будет в значительной степени способствовать достижению взаимопонимания между участниками проекта и коллективному использованию наиболее оптимальных подходов, а также позволит быстро обнаруживать и устранять ошибки.
Рекомендуется разработать список стандартных рекомендаций, определяющих в общих чертах стиль программирования для ваших проектов. Это может быть выполнено либо в виде простейших аннотаций к файлу с примерами кода, демонстрирующими принимаемые при написании программ соглашения, либо в форме исчерпывающего сборника рекомендаций для проектировщиков. Степень детализации подобных рекомендаций зависит от возможностей и потребностей вашей организации. Если такие стандарты или рекомендации у вас отсутствуют, целесообразно затратить некоторые усилия на их составление. Начните с самого простого и позаимствуйте подходящие стандарты написания программ из существующих опубликованных руководств, предварительно убедившись в том, что они для вас подходят, и их будут применять все члены рабочей группы. Вашей наградой будет единый стиль программирования в рамках всего проекта.
Определите модель памяти для вашего приложения
Поскольку мобильные приложения выполняются в средах с ограниченными ресурсами памяти, полезно определить и поддерживать явную модель, описывающую способы использования памяти и осуществления управления ею в вашем приложении. В современных высокоуровневых объектно-ориентированных вычислительных средах, использующих механизм сборки мусора (garbage collection), необходимости в отслеживании распределения отдельных областей памяти обычно не возникает, хотя это и может играть важную роль при низкоуровневом программировании таких, например, объектов, как драйверы устройств. Вместо этого гораздо важнее иметь в своем распоряжении модель, описывающую, какие именно объекты и в течение какого времени должны удерживаться в памяти. Рассматривая это как часть процесса проектирования, вы должны дать ответы на следующие вопросы:
■ Какие глобальные ресурсы будут кэшироваться в памяти? Одни объекты целесообразно кэшировать, тогда как хранить в памяти другие объекты было бы слишком расточительно. Трезво оцените, какие объекты к какой категории следует отнести.
■ Какой объем данных приложения будет загружаться в память в каждый момент времени? Большинству приложений приходится иметь дело с довольно крупными объемами данных, лишь часть которых должна быть загружена в память в каждый заданный момент времени.
■ При каких условиях возможно освобождение памяти от загруженных данных и ресурсов? Модели очистки памяти, позволяющие избавляться от данных и ресурсов, необходимость в которых в данный момент отсутствует, играют очень важную роль в процессах освобождения памяти, требуемой для сохранения других данных и ресурсов.
От вас, как от разработчика, зависит, будет ли осуществляться управление этими важными аспектами явным образом или же проблемы будут решаться по мере их возникновения, пока объем поглощаемой приложением памяти не превысит допустимые пределы. Соображения по этому поводу уже приводились в одной из предыдущих глав, когда мы обсуждали применение машин состояний для управления моделью памяти приложения. Если вы еще не читали этот материал, имеет смысл вернуться назад и просмотреть его. Эти же вопросы находятся в центре внимания следующей главы, посвященной рассмотрению методов управления памятью и производительностью.
Как можно чаще контролируйте показатели, характеризующие работу вашего приложения
Продумайте способы измерения важнейших показателей работы вашего приложения. Измерения — это ключ к получению информации, которая поможет вам находить оптимальные пути повышения производительности. При помощи соответствующих измерений вы можете оценивать быстродействие алгоритмов и скорость реакции пользовательского интерфейса. Можно также измерять показатели, характеризующие распределение памяти и ее использование различными объектами.
Анализируя проблемы производительности, подумайте над тем, какого типа данные будут наиболее полезными для этих целей и как их можно получить. Ниже приводится ряд рекомендаций по этому поводу, перечисленных в порядке уменьшения степени их важности:
1. Оснастите код средствами объективного контроля. Затратив лишь самые незначительные усилия, вы можете включить в код средства мониторинга, обеспечивающие получение объективных характеристик работы приложения. Этот процесс называют оснащением кода средствами контроля характеристик его функционирования. Получение достаточно большого объема информации о том, как работает код, создает хорошие предпосылки для его оптимизации. Хронометраж кода обычно не представляет особых затруднений; пример соответствующей программы приводится далее в этой главе. Сравнение эффективности различных алгоритмов на основании данных, полученных в результате измерения объективных характеристик выполнения кода, часто помогает значительно прояснить ситуацию.