2012-01-10 1 views
4

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

Я кодирующая 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]; 

Все волшебно работает НО размер файла более чем в два раза до 2MB!

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

ответ

1

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

+0

Да, я понимаю преимущества NSKeyedArchiver, но что, если мне не нужна обратная совместимость? нужна только производительность? В этом примере я даже не использую ключи, объекты все еще сохраняются последовательно, используя одни и те же кодеры, я использую только команду «Keyed», но сохраняю старый способ. Файл занимает более 15 секунд для загрузки в Iphone, что для пользователей очень много. –

+0

Рассматривали ли вы альтернативные методы хранения, такие как данные кода? Вам нужны все 3000 объектов, доступных сразу, или вы можете получить к ним доступ на страницах или кусках? – Rayfleck

+0

Я пошел с NSArchiver за его простоту. NSPropertyListSerialization не позволяет создавать пользовательские объекты. И я постоянно спрашиваю о 3000 предметах, поэтому они должны быть в памяти.Не помню, почему я прекратил использовать Core Data, обычно ли он эффективнее Archiver? –

0

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

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

Performance для простого корня объекта без детей и 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 repo и blog post.

 Смежные вопросы

  • Нет связанных вопросов^_^