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的支持。
答
我知道这个线程是老了,但你我要考虑使用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 repo和blog post。
是的,我了解NSKeyedArchiver的优点,但是如果我不需要向后兼容性呢?只需要表现?在这个例子中,我甚至没有使用键,对象仍然使用相同的编码器串联保存,我只使用“键控”命令,但仍然保存旧的方式。该文件需要超过15秒才能加载到Iphone中,这对于用户体验来说非常重要。 – 2012-01-10 18:24:54
您是否考虑过替代存储技术,如代码数据?您是否需要立即使用所有3000个对象,还是可以以页面或块的形式访问它们? – Rayfleck 2012-01-10 18:34:39
为了简单起见,我使用了NSArchiver。 NSPropertyListSerialization不允许自定义对象。我一直在查询3000个项目,所以他们必须记忆。不记得为什么我停止使用核心数据,它通常比Archiver更高效吗? – 2012-01-10 19:22:12