Подсказки по производительности
Если Ваши работы приложения с большим количеством файлов, производительность его связанного с файлом кода очень важна. Относительно других типов операций доступ к файлам на диске является одной из самых медленных операций, которые может выполнить компьютер. В зависимости от размера и числа файлов, это может взять где угодно от нескольких миллисекунд до нескольких минут для чтения файлов из находящегося на диске жесткого диска. Поэтому необходимо удостовериться, что код выполняет максимально эффективно под даже светом для модерирования рабочих нагрузок.
Если Ваше приложение замедляется или становится менее быстро реагирующим, когда оно начинает работать с файлами, используйте Инструментальное приложение для сбора некоторых базовых метрик. Инструменты могут показать Вам, сколько времени Ваше приложение проводит работу на файлах, и помогите Вам контролировать различное связанное с файлом действие. Поскольку Вы решаете каждую проблему, убедиться выполнить Ваш код в Инструментах снова и записать результаты так, чтобы можно было проверить, работали ли изменения.
Вещи искать в Вашем коде
Если Вы не уверены, где начать искать потенциал, фиксирует к Вашему связанному с файлом коду, вот некоторые подсказки относительно того, где начать смотреть.
Ищите места, где Ваш код читает много файлов (любого типа) от диска. Не забудьте искать места, где Вы загружаете файлы ресурсов также. Вы фактически используете данные от всех тех файлов сразу же? В противном случае Вы могли бы хотеть загрузить некоторые файлы более лениво.
Ищите места, где Вы используете более старые вызовы файловой системы. Большинство Ваших вызовов должно использовать интерфейсы Objective C или основанные на блоке интерфейсы. Вы можете использовать вызовы уровня BSD также, но не должны использовать более старые Основанные на углероде функции, воздействующие на
FSRef
илиFSSpec
структуры данных. XCode генерирует предупреждения, когда он обнаруживает Ваш код с помощью устаревших методов и функций, поэтому удостоверьтесь, что Вы проверяете те предупреждения.Ищите места, где Вы используете функции обратного вызова или методы для обработки данных файла. Если более новый API доступен, который берет блочный объект, Вы могли бы хотеть обновить свой код для использования того API вместо этого.
Ищите места, где Вы выполняете много маленьких операций чтения или операций записи на том же файле. Можно ли собрать в группу те операции и выполнить ли их одновременно? Для того же объема данных, одной большой операции чтения или операции записи обычно более эффективно, чем много маленьких операций.
Используйте современные интерфейсы файловой системы
При решении, который подпрограммы вызвать, выберите, позволяющие Вам указать использование путей NSURL
объекты по тем, которые указывают пути с помощью строк. Большинство ОСНОВАННЫХ НА URL подпрограмм было представлено в OS X v10.6 и позже и было разработано с начала использовать в своих интересах технологии как Центральная Отгрузка. Это дает Вашему коду прямое преимущество на многожильных компьютерах, не требуя, чтобы Вы выполнили много работы.
Необходимо также предпочесть подпрограммы, принимающие блочные объекты по тем, которые принимают функции обратного вызова или методы. Блоки являются удобным и более эффективным способом реализовать способы поведения типа обратного вызова. На практике блоки часто требуют, чтобы намного меньше кода реализовало, потому что они не требуют, чтобы Вы определили и управляли структурой данных контекста для передающих данных. Некоторые подпрограммы могли бы также выполнить Ваш блок путем планирования его в очереди GCD, которая может также улучшить производительность.
Общие советы
Что следует, некоторые основные рекомендации для сокращения действия I/O Вашей программы. Они могут помочь улучшить Вашу связанную с файловой системой производительность, но как со всеми подсказками, убедиться измериться прежде и после так, чтобы можно было проверить любое увеличение производительности.
Минимизируйте число операций файла, которые Вы выполняете. Движущиеся данные от локальной файловой системы в память занимают существенное количество времени. Времена доступа к файловой системе обычно измеряются в миллисекундах, который соответствует нескольким миллионам тактов, потраченных, ожидая данных, которые будут выбраны от диска. И если система конечного файла расположена на сервере на полпути во всем мире, сетевая задержка увеличивает задержку получения данных.
Объекты контуров повторного использования. Если Вы не торопитесь для создания
NSURL
для файла повторное использование, которые возражают так, как Вы можете, а не создавать его каждый раз, Вам нужен он. Определение местоположения файлов и создание URLs или информации о пути занимают время и могут быть дорогими. Многократное использование объектов, создаваемых из тех операций, экономит время и минимизирует взаимодействия Вашего приложения с файловой системой.Выберите надлежащий размер буфера чтения. При чтении данных с диска на локальный буфер размер буфера, который Вы выбираете, может иметь сильное воздействие на скорости работы. Если Вы работаете с относительно большими файлами, это не целесообразно выделять буфер 1K, чтобы считать и обработать данные в маленьких блоках. Вместо этого создайте более крупный буфер (скажите 128K 256K в размере), и читайте очень или все данные в память прежде, чем обработать его. Те же правила запрашивают запись данных к диску: Запишите данные так последовательно, как Вы можете с помощью единственного вызова файловой системы.
Считайте данные последовательно вместо того, чтобы перейти вокруг в файле. Ядро прозрачно кластеризирует операции I/O, который делает последовательные чтения намного быстрее.
Избегите перескакивать в пустом файле перед писанием данных. Системе, возможно, придется записать, обнуляет в прошедшее пространство для устранения разрыва. Вы должны всегда иметь серьезное основание для включения «дыр» в Ваших файлах во время записи и должны знать, что выполнение так могло бы подвергнуться потере производительности. Для получения дополнительной информации посмотрите, Заполняют нулями Задержки, Обеспечивают Безопасность по Стоимости.
Задержите операции I/O, пока для Вашего приложения не будут нужны данные. Золотое правило того, чтобы быть ленивым применяется к производительности диска, а также многим другим типам производительности.
Не злоупотребляйте предпочтительной системой. Используйте предпочтительную систему для получения только пользовательских настроек (таких как положения окна, настройки представления, и пользователь обеспечил предпочтения), и не данные, которые могут быть недорого повторно вычислены. Перевычисления простых значений значительно быстрее, чем чтение того же значения от диска.
Не предполагайте, что кэширование файлов в памяти ускорит Ваше приложение. Кэширование файлов в памяти увеличивает использование памяти, которое может уменьшить производительность другими способами. Плюс, система может кэшировать некоторые данные файла для Вас автоматически, так создание Ваших собственных кэшей могло бы сделать вещи еще хуже; посмотрите, что Система Имеет свой Собственный Механизм Кэширования файлов.
Система имеет свой собственный механизм кэширования файлов
Кэширование диска может быть хорошим способом ускорить доступ к данным файла, но его использование не является надлежащим в каждой ситуации. Кэширование увеличивает объем потребляемой памяти Вашего приложения, и, если используется неуместно может быть более дорогим, чем простая перезагрузка данных от диска.
Кэширование является самым подходящим для файлов, к которым Вы планируете получить доступ многократно. Если у Вас есть файлы, которые Вы намереваетесь использовать только один раз, или отключить кэши или отобразить файл в память.
Отключение кэширования файловой системы
При чтении данных, что Вы уверены, что не будете нуждаться снова скоро, такие как потоковая передача большого мультимедийного файла, скажете файловой системе не добавлять что данные к кэшам файловой системы. По умолчанию система поддерживает буферный кэш с данными, последний раз считанными из диска. Этот дисковый кэш является самым эффективным, когда он содержит часто используемые данные. Если Вы уезжаете, кэширование файлов включило при потоковой передаче большого мультимедийного файла, можно быстро заполнить дисковый кэш данными, которые Вы не будете использовать снова. Еще хуже то, что этот процесс, вероятно, продвинет другие данные из кэша, который, возможно, получил преимущества от того, чтобы быть там.
Приложения могут вызвать BSD fcntl
функция с F_NOCACHE
флаг, чтобы включить или отключить кэширование для файла. Для получения дополнительной информации об этой функции, посмотрите fcntl
.
Используя Отображенный I/O Вместо Кэширования
Если Вы намереваетесь считать данные случайным образом из файла, можно улучшить производительность в некоторых ситуациях путем отображения того файла непосредственно в пространство виртуальной памяти приложения. Отображение файла является удобством программирования для файлов, к которым Вы хотите получить доступ с полномочиями только для чтения. Это позволяет ядру использовать в своих интересах механизм разбивки на страницы виртуальной памяти для чтения данных файла только, когда это необходимо. Можно также использовать файл, отображающийся для перезаписи существующих байтов в файле; однако, Вы не можете расширить размер файла с помощью этого метода. Отображенные файлы обходят кэши системного диска, таким образом, только одна копия файла сохранена в памяти.
Для получения дополнительной информации об отображающихся файлах в память, посмотрите Файловую систему Усовершенствованные Темы Программирования.
Заполните нулями задержки, обеспечивают безопасность по стоимости
Для соображений безопасности файловые системы, как предполагается, обнуляют области на диске, когда они выделяются файлу. Это поведение предотвращает остаток данных от ранее удаленного файла от того, чтобы быть включенным с новым файлом. HFS Плюс файловая система, используемая OS X, всегда реализовывал, это заполняет нулями поведение.
И для читающих и для пишущих операций, задерживается система, запись обнуляет до прошлого момента. Когда Вы закрываете файл после записи в него, системные записи обнуляет к любым частям файла, которого не касался Ваш код. При чтении из файла системные записи обнуляют к новым областям только, когда код пытается читать из той области или когда это закрывает файл. Это поведение отложенной записи избегает избыточных операций I/O к той же области файла.
Если Вы замечаете задержку при закрытии файлов, это вероятно из-за этого, заполняют нулями поведение. Удостоверьтесь, что Вы делаете следующий при работе с файлами:
Запишите данные в файлы последовательно. Когда файл сохранен, разрывы в письменной форме должны быть заполнены нулями.
Не перемещайте указатель файла мимо конца файла и затем закрывайте файл.
Усеченные файлы для соответствия длины данных Вы записали. Для рабочих файлов Вы планируете удалить, усечь файл к нулевой длине.