Основные подсказки по производительности
Эта глава дает практический совет для того, как настроить Ваши программы. Это выдвигает предположения областей, которые Вы должны контролировать с инструментами производительности и также обеспечиваете список практических подсказок для улучшения производительности.
Общие зоны для контроля
Много проблем производительности могут быть прослежены до определенных частей Вашей программы. Как Вы разработка и реализация Ваш код, необходимо контролировать те области, чтобы удостовериться, что они встречают перспективные производственные показатели, которые Вы устанавливаете.
Кодируйте для ключевых задач своей программы
Поскольку Вы разрабатываете свою программу, рассматриваете задачи или потоки операций, с которыми пользователи встретятся больше всего. Во время Вашей фазы реализации убедиться контролировать код для тех задач и удостовериться их производительность не опускается ниже допустимых уровней. Если это делает, необходимо незамедлительно принять меры для исправления проблем.
Ключевые задачи, выполняемые программой, варьируются от межпрограммного. Например, в то время как утилита файла должна будет быть быстрой при сканировании файлов и каталогов на жестком диске, текстовой процессор, возможно, должен был бы быть быстрым во время ввода текста и дисплея. Вам решать для решения, который определяет задачу пользователей, наиболее вероятно, выполнят.
Для получения информации о том, как идентифицировать и фиксировать медленные операции в Вашей программе, видит Инструкции по Быстродействию Кода.
Код для прорисовки
Большинство программ делает некоторую сумму получения. Если Ваша программа использует только стандартные окна и средства управления, то Вы, вероятно, не должны волноваться слишком много о рисовании производительности. Однако, если Вы делаете какое-либо пользовательское получение, необходимо контролировать код для прорисовки и удостовериться, что это выполняет на допустимых уровнях. В частности при поддержке какого-либо из следующих необходимо исследовать способы оптимизировать код для прорисовки.
Живое изменение размеров
Пользовательский код для прорисовки представления, особенно если части представления могут быть обновлены, не обновляя целое представление
Текстурированная графика
Полностью непрозрачные представления
Для получения информации о том, как оптимизировать производительность получения, см. Инструкции по Производительности Получения.
Код инициализации времени запуска
Время запуска - то, где Вы инициализируете структуры данных своей программы и подготавливаете Ваше приложение для получения ввода данных пользователем. Однако много программ действительно намного больше работают во время запуска, чем необходимо. Во многих случаях задачи, выполняемые во время запуска, могут быть задержаны, пока приложение не отправило свой пользовательский интерфейс и начало обрабатывать события. Эта отсрочка дает пользователю восприятие, что Ваше приложение быстро, который является хорошим первым впечатлением, которое сделает.
Для приложений, которые должны работать в версии 10.3.3 OS X и ранее, другой способ улучшить времена запуска состоит в том, чтобы предварительно связать Ваше приложение. Предварительная привязка включает предварительное вычисление диапазонов адресов библиотеки и хранение тех значений в Вашем двоичном файле приложения. Этот шаг избавляет от необходимости динамический загрузчик (dyld
) вычислить те диапазоны адресов во время запуска. Улучшения dyld
для OS X версия 10.3.4 делают предварительную привязку ненужной в этом и более поздних выпусках. Точно так же предварительная привязка является ненужной в iOS.
Для получения информации о том, как улучшить разовую запуском производительность, см. Инструкции по Производительности Времени Запуска.
Код доступа к файлу
Файловая система является узким местом для того, чтобы получить информацию в память и CPU. Во время это берет для доступа к файлу, десятки миллионов инструкций могут быть выполнены. Поэтому обязательно, чтобы Вы исследовали способ, которым Ваша программа использует файлы и удостоверяться, что те файлы фактически необходимы и используются должным образом.
Минимизация числа файлов, которые Вы используете, является одним способом улучшить связанную с файлом производительность. При доступе к файлам помните следующее:
Поймите, как системные данные файла кэшей и знают, как оптимизировать использование тех кэшей. Избегите кэшировать данные сами, если Вы не планируете обратиться к ним несколько раз.
Считайте и запишите данные последовательно, когда это возможно. Переход вокруг файла занимает дополнительное время для поиска на новое расположение.
Считайте большие блоки данных из файлов, когда это возможно, имея в виду, что чтение слишком большого количества данных сразу могло бы вызвать различные проблемы. Например, чтение всего содержания файла на 32 МБ могло бы инициировать разбивку на страницы того содержания, прежде чем работа будет завершена.
Избегите закрывать и вновь открывать файлы излишне. Если кэширование включено, делание так может заставить кэш быть обновленным, даже если не изменялись данные.
Для получения информации о том, как идентифицировать и решить связанные с файлом проблемы производительности, видит Инструкции по Производительности Файловой системы.
Место приложения
Размер Вашего кода может иметь огромный эффект на производительность системы. Чем больше страниц памяти, используемых Вашей программой, тем меньше там доступны для системы и других программ. Это давление памяти может в конечном счете привести к разбивке на страницы и полному системному замедлению.
Управление Вашим местом кода является всем об организации Вашего кода и структур данных. Необходимо удостовериться, что у Вас есть правильные части в памяти и что Вы не заставляете страниц памяти быть считанными или записанными излишне. Некоторые проблемы, вызывающие место памяти большой емкости, следующие:
Кодовые страницы содержат неиспользованный код. Компилятор обычно организует код модулем компиляции, который является не всегда лучшим методом. Организация Ваших модулей на основе того, что код выполняет вместе, могла бы быть лучшей опцией.
Статические или постоянные данные хранятся на перезаписываемых страницах. Во время разбивки на страницы эти данные записаны в диск излишне. Сделайте то, что Вы можете для перемещения этих данных в неперезаписываемые страницы, которые могут быть очищены быстро.
Программа экспортирует больше символов, чем фактически необходимо. Символы занимают место и только необходимы внешним модулям кода, которые должны вызвать в Вашу программу. Удалите любые символы, которые не должны использоваться внешне.
Код должным образом не оптимизирован компилятором и компоновщиком. Обязательно попробуйте настройки оптимизации компилятора и посмотрите, какой работает лучше всего на Вашу программу.
Слишком много платформ включены программой. Загрузите только платформы, которые фактически использует Ваша программа.
Для получения информации о том, как найти и решить проблемы места кода, видит Инструкции по Производительности Размера кода.
Код выделения памяти
Программы выделяют память для хранения и постоянные и временные структуры данных. Каждому выделению памяти связали стоимость с ним, и в процессорное время и в потреблении памяти. Понимание, когда Ваша программа выделяет память и как та память используется, может помочь Вам сократить оба из тех затрат.
Понимание использования памяти Вашей программы может помочь определить способы сократить то использование. Можно использовать доступные инструменты производительности, чтобы узнать, освобождаются ли автовыпущенные объекты Objective C, прежде чем они вызовут слишком много разбивки на страницы. Можно также использовать эти инструменты для нахождения утечек памяти вызванными ошибками в коде. При наблюдении числа раз Вы вызываете malloc
мог бы также указать на места, где можно снова использовать существующие блоки памяти, а не создать новые.
Одно важное правило следовать при выделении памяти состоит в том, чтобы быть ленивым. Задержите выделения памяти, пока Вам фактически не будет нужна используемая память. Для некоторых дополнительных путей можно быть ленивыми с выделениями памяти, видеть Быть Ленивыми.
Для получения информации об оптимизации Ваших образцов выделения памяти см. Инструкции по Производительности Использования памяти.
Фундаментальные подсказки по оптимизации
Прежде чем Вы начнете реализовывать новую программу, существует несколько улучшений производительности, необходимо рассмотреть добавление. Несмотря на то, что Вы не могли бы быть в состоянии использовать в своих интересах все эти улучшения в каждом случае, необходимо, по крайней мере, рассмотреть их в течение фазы проектирования.
Будьте ленивы
Очень простой способ улучшить производительность состоит в том, чтобы удостовериться, что Ваше приложение не выполняет ненужной работы. Каждый момент времени приложения должен быть потрачен, ответив на текущий запрос пользователя, не предсказав будущие запросы. Если Вам не нужен ресурс сразу же, такой как файл пера, содержащий предпочтительное окно, не загружайте его. Такое действие занимает время для выполнения, потому что оно получает доступ к файловой системе, и если пользователь никогда не открывает то предпочтительное окно, процесс загрузки его файла пера является пустой тратой времени.
Основное правило следовать состоит в том, чтобы ожидать, пока пользователь не запрашивает что-то из Вашего приложения, затем используйте необходимые ресурсы для выполнения запроса. Вы должны данные кэша только в ситуациях, где существует измеримый выигрыш в производительности. Предварительно загружение кэшей при условии, что остальная часть приложения будет работать быстрее, может фактически ухудшить производительность в ситуациях низкой памяти. В такой ситуации Ваши кэшированные данные могли бы быть разбиты на страницы к диску, прежде чем это сможет использоваться. Таким образом, любые сбережения, Вы полученный путем кэширования данных превращаетесь в потерю, потому что те данные должны теперь быть считаны из диска дважды, прежде чем это будет когда-либо использоваться. Если Вы действительно хотите к данным кэша, сделайте так после того, как работа была выполнена один раз.
Некоторые другие вещи быть ленивым о включают следующее:
Задержите выделения памяти, пока Вам фактически не будет нужна память.
Не обнуляйте - инициализируют блоки памяти. Вызовите
calloc
функция, чтобы сделать это для Вас лениво.Дайте системе шанс загрузить Ваш код лениво. Профилируйте и организуйте свой код так, чтобы для системных нагрузок только код было нужно для текущей работы.
Задержите чтение содержания файла, пока Вам фактически не будет нужна информация.
Используйте в своих интересах воспринятую производительность
Восприятие производительности является столь же эффективным как фактическая производительность во многих случаях. Много задач программы могут быть выполнены в фоновом режиме, с помощью очереди отгрузки, или во время простоя. Выполнение этого сохраняет основной поток приложения свободным обработать взаимодействие с пользователем и заставляет программный интерфейс чувствовать себя более быстро реагирующим пользователю. Поскольку Вы разрабатываете свою программу, думайте, о котором задачи могут быть перемещены в фон эффективно. Например, если Ваша программа должна отсканировать много файлов или выполнить долгие вычисления, сделать настолько использующую очередь отгрузки.
Другой способ улучшить воспринятую производительность состоит в том, чтобы удостовериться, что Ваше приложение запускается быстро. Во время запуска задержите любые задачи, не способствующие непосредственному представлению Вашего интерфейса приложения. Например, задержите создание больших структур данных, пока Ваше приложение не закончит запускаться и выведет на экран свое главное окно. Если Вы используете свое главное окно для отображения некоторых данных, которые должны быть вычислены или получены во время запуска, показать окно сначала вместе с индикатором хода выполнения или другим сообщением о состоянии, указывающим, что загружаются данные. Для приложений, использующих плагины, избегите загружать плагины, пока не фактически необходим их код.
Используйте основанные на событии обработчики
Все современные приложения Mac должны использовать систему событий Какао или менеджер событий Углерода. (Точно так же приложения для iPhone должны использовать сенсорную систему событий, предоставленную платформой UIKit.) Ваше приложение никогда не должно получать события путем опроса системы. Выполнение так очень неэффективно. Фактически, когда нет никаких событий для обработки, опрашивать код является 100-процентной пустой тратой процессорного времени. Современный основанный на событии APIs разработан для предоставления следующих преимуществ:
Они делают Вашу программу более быстро реагирующей пользователю.
Они сокращают использование CPU Вашего приложения.
Они минимизируют рабочий набор Вашего приложения — число кодовых страниц, загруженных в памяти в любой момент времени.
Они позволяют системе управлять питанием настойчиво.
Помимо пользовательских событий, необходимо избежать опрашивать в других ситуациях также. Потоки в OS X и iOS используют выполненные циклы для обеспечения по требованию ответов на таймеры, сетевые события и другие входящие данные. Когда задача завершается, много платформ также используют модель асинхронного программирования для определенных задач, уведомляя определяемую функцию-обработчик или метод. В OS X v10.6 и позже, источники отгрузки также обеспечивают способ для Вас получить важные события асинхронно и выполнить их на очереди отгрузки.
Улучшите параллелизм задач своей программы
На компьютерах с многократными ядрами параллелизм является другим способом улучшить и воспринятую и фактическую производительность Вашей программы. Программа, которая в состоянии выполнить многократные задачи одновременно, может выполнить те задачи параллельно на многожильном компьютере. Даже когда компьютер имеет только одно ядро, факторинг, Ваш код в многократные, асинхронные задачи может обеспечить воспринятое повышение скорости, когда сделано правильно. В частности необходимо выполнить пользовательские задачи с помощью очереди отгрузки и оставить основной поток свободным обработать пользовательские события и обновить пользовательский интерфейс прежде всего.
Прежде чем Вы начнете добавлять поддержку параллелизма, тем не менее, убедиться поместить некоторую мысль в то, как Ваша программа могла бы реализовать соответствующие задачи эффективно. Факторинг Ваш код в различные задачи требует некоторого рассмотрения Ваших структур данных программы и путей выполнения кода. Задачи, совместно использующие структуры данных, могут потребовать, чтобы использование последовательной очереди отгрузки синхронизировало доступ к тем структурам.
Для получения информации о том, как реализовать параллелизм в Вашей программе, см. Руководство по программированию Параллелизма.
Используйте ускорять платформу
Если Ваше приложение выполняет много математических вычислений на скалярных данных, необходимо рассмотреть использование Ускорять платформы (Accelerate.framework
) ускорять те вычисления. Ускорять платформа использует в своих интересах любые доступные векторные блоки обработки (такие как Intel x86 расширения SSE) для выполнения многократных вычислений параллельно. Путем кодирования к платформе, вместо к векторному модулю, можно избежать иметь необходимость создать отдельные пути выполнения кода для каждой архитектуры платформы. Ускорять платформа высоко настраивается для всех поддержек OS X архитектуры.
Инструменты, такие как Инструменты могут помочь указать на части Вашей программы, которая могла бы получить преимущества от использования Ускорять платформы. Для получения дополнительной информации об использовании этих и других инструментов посмотрите Инструменты Производительности.
Модернизируйте свое приложение
Если бы Ваша программа была разработана для работы более старой версии Mac OS, то необходимо обновить код для поддержки соглашений OS X. В частности необходимо избегать использования более старых технологий, таких как Углерод или устаревшие технологии, такие как QuickDraw. Вместо этого необходимо создать приложения с помощью Касания Какао или Какао. Необходимо также обновить двоичный формат к Мужественному. Мужественный формат является единственным форматом, поддерживаемым на основанных на Intel компьютерах Macintosh и основанных на iOS устройствах.
Для списка технологий, доступных для использования в приложениях Mac, см. Технологический Обзор Mac. Для списка технологий, доступных для использования в iOS, см. Технологический Обзор iOS.