2012-01-10 77 views
4

爲什麼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的支持。

回答

1

您正在獲得向前和向後的兼容性。這是,這意味着存檔必須存儲更多的信息來做鍵控查找。在這裏看到裁判: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

0

至於尺寸減小,我相信它與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