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