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