Кэширование и память Purgeable
Кэширование и purgeable память может быть жизненно важными активами разработчикам, имеющим дело с большими объектами, требующими значительной памяти или время вычисления или разработчики, код которых увязает как компьютерные данные записей к диску, потому что RAM полон.
Обзор кэширования
Кэш является набором объектов или данных, которые могут значительно увеличить производительность приложений.
Почему кэширование использования?
Разработчики используют кэши, чтобы хранить объекты, к которым часто получают доступ, с текущими данными, которые могут быть дорогими для вычислений. Многократное использование этих объектов может обеспечить выигрыши в производительности, потому что не должны быть повторно вычислены их значения. Если память трудна, Однако объекты не критически важны по отношению к приложению и могут быть отброшены. Если отброшено, их значения должны будут быть повторно вычислены снова при необходимости.
Кэширование задач может вызвать
Несмотря на то, что кэширование может предоставить огромные преимущества с точки зрения производительности, существуют также некоторые возможные недостатки то кэширование подарки. Самое главное кэширование может использовать очень большие объемы памяти. При кэшировании многих больших объектов данных возможно кэшировать столько объектов, что нет никакого RAM, уехал в другие приложения, и компьютер прекратит работу, поскольку это пишет все эти данные к диску для высвобождения RAM.
Решения
Какао обеспечивает NSCache
возразите как удобный контейнер хранения для элементов, которые Вы хотите кэшировать, одновременно решение проблем управления памятью обсудило выше. NSCache
класс очень подобен NSDictionary
класс, в этом они оба содержат пары ключ/значение. Однако NSCache
объект является “реактивным кэшем”. Т.е. когда память доступна, это настойчиво кэши любые данные, это дано. Все же, когда память является низкой, она автоматически отбросит некоторые свои элементы для высвобождения памяти для других приложений. Позже, если эти отброшенные элементы необходимы, их значения должны будут быть повторно вычислены.
NSCache
обеспечивает две других полезных «предельных» функции: ограничение числа кэшируемых элементов и ограничения общей стоимости всех элементов в кэше. Для ограничения числа элементов, которое кэшу позволяют иметь вызовите метод setCountLimit:
. Например, при попытке добавить 11 элементов к кэшу чей countLimit
установлен в 10
, кэш мог автоматически отбросить один из элементов.
При добавлении элементов к кэшу можно указать a cost
значение, которое будет связано с каждой парой ключ/значение. Вызовите setTotalCostLimit:
метод для установки максимального значения для суммы затрат всех кэшируемых объектов. Таким образом, когда объект добавляется что нажатия totalCost
выше totalCostLimit
, кэш мог автоматически выселить некоторые свои объекты для возвращения ниже порога. Этот процесс замещения не гарантируется, таким образом пытаясь управлять cost
значения для достижения определенного поведения могли быть вредны для производительности кэша. Передача в 0
для cost
если Вы не имеете ничего полезного, или используете setObject:forKey:
метод, не требующий, чтобы стоимость была передана в.
Используя память Purgeable
Платформа Какао также обеспечивает NSPurgeableData
класс, чтобы помочь гарантировать, чтобы Ваши приложения не израсходовали слишком много памяти. NSPurgeableData
класс принимает NSDiscardableContent
протокол, который любой класс может реализовать, чтобы позволить памяти быть отброшенной, когда клиенты экземпляров класса закончены, получив доступ к тем объектам. Необходимо реализовать NSDiscardableContent
при создании объектов, имеющих доступные субкомпоненты. Кроме того, NSPurgeableData
класс не должен использоваться в сочетании с NSCache
; можно использовать его независимо для получения поведения чистки.
Преимущества Использования памяти Purgeable
При помощи purgeable памяти Вы позволяете системе быстро восстанавливать память, если это должно, таким образом увеличивая производительность. Память, отмеченная как purgeable, не разбита на страницы к диску, когда в отношении этого предъявляет претензии система виртуальной памяти, потому что разбивка на страницы является длительным процессом. Вместо этого данные отбрасываются, и в случае необходимости позже, они должны будут быть повторно вычислены.
Протест при использовании purgeable памяти состоит в том, что блок памяти должен быть заблокирован прежде чем быть полученным доступ. Этот механизм блокировки необходим, чтобы гарантировать, чтобы никакие политики автоудаления не пытались избавиться от данных при доступе к нему. Точно так же механизм блокировки гарантирует, что система виртуальной памяти уже не отбросила данные. NSPurgeableData
класс реализует очень простой механизм блокировки, чтобы гарантировать, что данные безопасны, в то время как это читается.
Как реализовать память Purgeable
NSPurgeableData
класс очень прост использовать, потому что класс просто реализует NSDiscardableContent
протокол. Тогда понятие «встречной» переменной является центральным к жизненному циклу NSDiscardableContent
объекты. Когда память, используемая этим объектом, будет считана или будет все еще необходима, его переменная счетчика будет больше, чем или равняться 1
. Когда это не используется и может быть отброшено, переменная счетчика равна 0
.
Когда счетчик равен 0
, если память трудна, блок памяти может быть отброшен. Для отбрасывания содержания вызвать discardContentIfPossible
на объекте, освобождающем связанную память, если переменная счетчика равняется 0
.
По умолчанию, когда NSPurgeableData
объект инициализируется, он создается с переменной счетчика, равной 1
и может безопасно быть получен доступ. Для доступа к purgeable памяти просто вызовите beginContentAccess
метод. Этот метод сначала проверит, чтобы удостовериться, что не были отброшены данные объекта. Если данные будут все еще там, то они постепенно увеличат переменную счетчика для защиты памяти, в то время как они читаются, и возвратиться YES
. Если данные были отброшены, этот метод возвратится NO
. Когда Вы будете сделаны, получая доступ к данным, вызвать endContentAccess
, если система желает сделать так, который постепенно уменьшает счетчик и позволяет памяти быть отброшенной. Необходимо отслеживать состояние переменной счетчика и память доступа только если beginContentAccess
возвраты метода YES
.
Системные объекты или объекты клиента вызывают discardContentIfPossible
метод для отбрасывания purgeable данных, если кончается доступная память системы. Если его переменная счетчика будет, этот метод только отбросит данные 0
, и иначе ничего не делает. Наконец, isContentDiscarded
возвраты метода YES
если была отброшена память.
Ниже пример жизненного цикла для NSPurgeableData
объект:
NSPurgeableData * data = [[NSPurgeableData alloc] init]; |
[data endContentAccess]; //Don't necessarily need data right now, so mark as discardable. |
//Maybe put data into a cache if you anticipate you will need it later. |
... |
if([data beginContentAccess]) { //YES if data has not been discarded and counter variable has been incremented |
...Some operation on the data... |
[data endContentAccess] //done with the data, so mark as discardable |
} else { |
//data has been discarded, so recreate data and complete operation |
data = ... |
[data endContentAccess]; //done with data |
} |
//data is able to be discarded at this point if memory is tight |
Память Purgeable и NSCache
Объекты когда, реализующие NSDiscardableContent
протокол вставляется NSCache
объекты, кэш сохраняет сильную ссылку к объекту. Однако, если содержание объекта было отброшено и кэш evictsObjectsWithDiscardedContent
значение установлено в YES
, объект автоматически удален из кэша и не найден вызовом поиска.
Некоторые предупреждения о памяти Purgeable
Протест к использованию purgeable памяти состоит в том, что только большие объекты или блоки памяти могут использовать его непосредственно. purgeable API памяти действует на много объекты виртуальной памяти страницы, который делает его трудно для маркировки единственного маленького элемента кэша как purgeable. Кэширующийся API сделает требуемый бухгалтерский учет, чтобы позволить маленьким элементам кэша использовать purgeable память. Аналогично, будут случаи, где это неудобно выделить память для элементов кэша через API непосредственно, такой как тогда, когда удобный метод используется для выделения объекта или когда объект выделяется в различном уровне, чем уровень, делающий кэширование. В таких случаях не возможно использовать purgeable память.
Когда использовать память Purgeable
Это целесообразно использовать purgeable память, когда ожидаемая стоимость чистки является меньше, чем ожидаемая стоимость разбивки на страницы — когда стоимость разбивки на страницы больше, чем стоимость перевычислений определенных времен значения данных вероятность, что снова используется тот элемент данных. Много кэшей попадают в эту категорию, потому что их спекулятивный характер делает ее, вероятно, что элементы не будут использоваться снова. Точно так же легко повторно вычисленные элементы кэша являются главными кандидатами на purgeable память, потому что приложение не примет огромный удар производительности, если должны быть повторно вычислены их значения.