NSArchiver против NSKeyedArchiver производительности - PullRequest
4 голосов
/ 10 января 2012

Почему производительность NSKeyedArchiver такая низкая? Размер удваивается по сравнению с использованием NSArchiver.

Я кодирую NSMutableArray объектов со следующей строкой

BOOL result = [NSArchiver archiveRootObject:self.appDataObject.materias toFile:archivePath];

NSMutableArray содержит пользовательские объекты, которые имеют свои соответствующие encodeWithCoder и initWithCoder

-(void)encodeWithCoder:(NSCoder *)aCoder
{

    [aCoder encodeObject: _fileName];
    [aCoder encodeObject: _categoria];
    [aCoder encodeObject: _materia];
    [aCoder encodeObject: _nombre];

    [aCoder encodeObject: _position];
    [aCoder encodeValueOfObjCType:@encode(BOOL) at:&_favorite];

}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self=[super init]) {
        [self setFileName:[aDecoder decodeObject]];
        [self setCategoria:[aDecoder decodeObject]];
        [self setMateria:[aDecoder decodeObject]];
        [self setNombre:[aDecoder decodeObject]];

        [self setPosition:[aDecoder decodeObject]];
        [aDecoder decodeValueOfObjCType:@encode(BOOL) at:&_favorite];
    }

    return self;
}

он работает нормально, так как правильно сохраняет файл, а затем я могу его разархивировать. Это около 3000 объектов и выходной файл около 900kB

Проблема возникает, когда я меняю строку архивирования на:

BOOL result = [NSKeyedArchiver archiveRootObject:self.appDataObject.materias toFile:archivePath];

Все волшебно работает НО размер файла более чем удваивается до 2 МБ !

Почему я спрашиваю это? потому что я разрабатываю приложение для iOS и поэтому теряю поддержку NSArchiver.

Ответы [ 3 ]

1 голос
/ 10 января 2012

Вы получаете прямую и обратную совместимость. Это keyed , что означает, что архив должен хранить больше информации для поиска по ключу. См. Ссылку здесь: Архивы и сериализация

0 голосов
/ 15 апреля 2015

Что касается уменьшения размера, я думаю, что это как-то связано с хранением ссылок NSKeyedArchiver, а не с фактическими значениями.

Я сравнил NSKeyedArchiver и NSArchiver вместе с новым классом NSKeylessArchiver, основанным накокотрона (NSArchiver может быть недоступен на iOS из-за статуса частного API).NSKeylessArchiver использует ссылки для уменьшения размера данных с повторяющимися строками или объектами и является гораздо более быстрой альтернативой декодирования, если вам не нужны ключи.

Производительность для простого корневого объекта без дочерних элементов и 20000 дюймов:

|                 |encoding (min/max/avg secs)|decoding (min/max/avg secs)|
|-----------------|:-------------------------:|:-------------------------:|
|NSKeyedArchiver  |  0.2048/0.2453/0.2165     |  6.8919/6.9238/6.9037|
|NSKeylessArchiver|  0.0407/0.0506/0.0451     |  0.0253/0.0330/0.0287|
|NSArchiver       |  0.0094/0.0114/0.0102     |  0.0019/0.0025/0.0020|

Подробнее см. В репозитории Github и в блоге .

0 голосов
/ 15 февраля 2015

Я знаю, что этот поток старый, но вы можете рассмотреть возможность использования NSPropertyListSerialization ...

Взгляните на разницу в производительности, упомянутую в этой теме: http://www.cocoabuilder.com/archive/cocoa/2221-nspropertylistserialization-vs-nskeyedarchiver-performance.html

...