NSArchiver vs NSKeyedArchiver性能

问题描述:

为什么NSKeyedArchiver性能如此之差?大小加倍与使用NSArchiver。NSArchiver vs NSKeyedArchiver性能

我有以下行

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

的NSMutableArray的编码对象的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的支持。

您正在获得向前和向后的兼容性。这是,这意味着存档必须存储更多的信息来做键控查找。在这里看到裁判:Archives and Serialization

+0

是的,我了解NSKeyedArchiver的优点,但是如果我不需要向后兼容性呢?只需要表现?在这个例子中,我甚至没有使用键,对象仍然使用相同的编码器串联保存,我只使用“键控”命令,但仍然保存旧的方式。该文件需要超过15秒才能加载到Iphone中,这对于用户体验来说非常重要。 – 2012-01-10 18:24:54

+0

您是否考虑过替代存储技术,如代码数据?您是否需要立即使用所有3000个对象,还是可以以页面或块的形式访问它们? – Rayfleck 2012-01-10 18:34:39

+0

为了简单起见,我使用了NSArchiver。 NSPropertyListSerialization不允许自定义对象。我一直在查询3000个项目,所以他们必须记忆。不记得为什么我停止使用核心数据,它通常比Archiver更高效吗? – 2012-01-10 19:22:12

我知道这个线程是老了,但你我要考虑使用NSPropertyListSerialization ...

看看性能差异在这个线程中提到: http://www.cocoabuilder.com/archive/cocoa/2221-nspropertylistserialization-vs-nskeyedarchiver-performance.html

至于尺寸减小,我相信它与NSKeyedArchiver存储引用有关,而不是实际值。

我比较了NSKeyedArchiver和NSArchiver,以及一个基于cocotron的NSKeylessArchiver类(由于私有API状态,NSArchiver可能在iOS上禁用)。 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 repoblog post