Подсказки по производительности

Если Ваши работы приложения с большим количеством файлов, производительность его связанного с файлом кода очень важна. Относительно других типов операций доступ к файлам на диске является одной из самых медленных операций, которые может выполнить компьютер. В зависимости от размера и числа файлов, это может взять где угодно от нескольких миллисекунд до нескольких минут для чтения файлов из находящегося на диске жесткого диска. Поэтому необходимо удостовериться, что код выполняет максимально эффективно под даже светом для модерирования рабочих нагрузок.

Если Ваше приложение замедляется или становится менее быстро реагирующим, когда оно начинает работать с файлами, используйте Инструментальное приложение для сбора некоторых базовых метрик. Инструменты могут показать Вам, сколько времени Ваше приложение проводит работу на файлах, и помогите Вам контролировать различное связанное с файлом действие. Поскольку Вы решаете каждую проблему, убедиться выполнить Ваш код в Инструментах снова и записать результаты так, чтобы можно было проверить, работали ли изменения.

Вещи искать в Вашем коде

Если Вы не уверены, где начать искать потенциал, фиксирует к Вашему связанному с файлом коду, вот некоторые подсказки относительно того, где начать смотреть.

Используйте современные интерфейсы файловой системы

При решении, который подпрограммы вызвать, выберите, позволяющие Вам указать использование путей NSURL объекты по тем, которые указывают пути с помощью строк. Большинство ОСНОВАННЫХ НА URL подпрограмм было представлено в OS X v10.6 и позже и было разработано с начала использовать в своих интересах технологии как Центральная Отгрузка. Это дает Вашему коду прямое преимущество на многожильных компьютерах, не требуя, чтобы Вы выполнили много работы.

Необходимо также предпочесть подпрограммы, принимающие блочные объекты по тем, которые принимают функции обратного вызова или методы. Блоки являются удобным и более эффективным способом реализовать способы поведения типа обратного вызова. На практике блоки часто требуют, чтобы намного меньше кода реализовало, потому что они не требуют, чтобы Вы определили и управляли структурой данных контекста для передающих данных. Некоторые подпрограммы могли бы также выполнить Ваш блок путем планирования его в очереди GCD, которая может также улучшить производительность.

Общие советы

Что следует, некоторые основные рекомендации для сокращения действия I/O Вашей программы. Они могут помочь улучшить Вашу связанную с файловой системой производительность, но как со всеми подсказками, убедиться измериться прежде и после так, чтобы можно было проверить любое увеличение производительности.

Система имеет свой собственный механизм кэширования файлов

Кэширование диска может быть хорошим способом ускорить доступ к данным файла, но его использование не является надлежащим в каждой ситуации. Кэширование увеличивает объем потребляемой памяти Вашего приложения, и, если используется неуместно может быть более дорогим, чем простая перезагрузка данных от диска.

Кэширование является самым подходящим для файлов, к которым Вы планируете получить доступ многократно. Если у Вас есть файлы, которые Вы намереваетесь использовать только один раз, или отключить кэши или отобразить файл в память.

Отключение кэширования файловой системы

При чтении данных, что Вы уверены, что не будете нуждаться снова скоро, такие как потоковая передача большого мультимедийного файла, скажете файловой системе не добавлять что данные к кэшам файловой системы. По умолчанию система поддерживает буферный кэш с данными, последний раз считанными из диска. Этот дисковый кэш является самым эффективным, когда он содержит часто используемые данные. Если Вы уезжаете, кэширование файлов включило при потоковой передаче большого мультимедийного файла, можно быстро заполнить дисковый кэш данными, которые Вы не будете использовать снова. Еще хуже то, что этот процесс, вероятно, продвинет другие данные из кэша, который, возможно, получил преимущества от того, чтобы быть там.

Приложения могут вызвать BSD fcntl функция с F_NOCACHE флаг, чтобы включить или отключить кэширование для файла. Для получения дополнительной информации об этой функции, посмотрите fcntl.

Используя Отображенный I/O Вместо Кэширования

Если Вы намереваетесь считать данные случайным образом из файла, можно улучшить производительность в некоторых ситуациях путем отображения того файла непосредственно в пространство виртуальной памяти приложения. Отображение файла является удобством программирования для файлов, к которым Вы хотите получить доступ с полномочиями только для чтения. Это позволяет ядру использовать в своих интересах механизм разбивки на страницы виртуальной памяти для чтения данных файла только, когда это необходимо. Можно также использовать файл, отображающийся для перезаписи существующих байтов в файле; однако, Вы не можете расширить размер файла с помощью этого метода. Отображенные файлы обходят кэши системного диска, таким образом, только одна копия файла сохранена в памяти.

Для получения дополнительной информации об отображающихся файлах в память, посмотрите Файловую систему Усовершенствованные Темы Программирования.

Заполните нулями задержки, обеспечивают безопасность по стоимости

Для соображений безопасности файловые системы, как предполагается, обнуляют области на диске, когда они выделяются файлу. Это поведение предотвращает остаток данных от ранее удаленного файла от того, чтобы быть включенным с новым файлом. HFS Плюс файловая система, используемая OS X, всегда реализовывал, это заполняет нулями поведение.

И для читающих и для пишущих операций, задерживается система, запись обнуляет до прошлого момента. Когда Вы закрываете файл после записи в него, системные записи обнуляет к любым частям файла, которого не касался Ваш код. При чтении из файла системные записи обнуляют к новым областям только, когда код пытается читать из той области или когда это закрывает файл. Это поведение отложенной записи избегает избыточных операций I/O к той же области файла.

Если Вы замечаете задержку при закрытии файлов, это вероятно из-за этого, заполняют нулями поведение. Удостоверьтесь, что Вы делаете следующий при работе с файлами:

  • Запишите данные в файлы последовательно. Когда файл сохранен, разрывы в письменной форме должны быть заполнены нулями.

  • Не перемещайте указатель файла мимо конца файла и затем закрывайте файл.

  • Усеченные файлы для соответствия длины данных Вы записали. Для рабочих файлов Вы планируете удалить, усечь файл к нулевой длине.