2012-01-10 5 views
4

なぜNSKeyedArchiverのパフォーマンスが悪いですか? NSArchiverを使用してサイズが倍になります。NSArchiverと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の利点を理解していますが、もし私が下位互換性を必要としないのであれば?パフォーマンスだけが必要ですか?この例では、キーを使用していなくても、オブジェクトは同じコーダーを使用してシリーズに保存されていますが、「キー付き」コマンドだけを使用していますが、古い方法は保存しています。このファイルは、ユーザー体験のためにたくさんあるIphoneで読み込むのに15秒以上かかる。 –

+0

コードデータなどの代替記憶技術を検討しましたか?一度に利用できる3000個のオブジェクトがすべて必要ですか、またはそれらをページやチャンクにアクセスできますか? – Rayfleck

+0

シンプルさのためにNSArchiverと一緒に行きました。 NSPropertyListSerializationはカスタムオブジェクトを許可しません。そして、私は常に3000アイテムを照会しているので、彼らは記憶にいなければなりません。なぜCore Dataを使用しなくなったのかを覚えていないのですが、一般的にArchiverよりも効率的ですか? –

0

サイズの縮小に関しては、NSKeyedArchiverが実際の値とは対照的に参照を格納することと関係があると思います。

NSKeyedArchiverとNSArchiverを、ココトロンに基づいたNSKeylessArchiverという新しいクラス(NSArchiverが非公開APIステータスのためにiOS上で動作しない可能性があります)と比較しました。 NSKeylessArchiverは、文字列やオブジェクトが繰り返されるデータのサイズを減らすためにリファレンスを使用します。キーを必要としない場合は、デコードの方がはるかに高速です。子供と20000個のint型のない単純なルートオブジェクトのための

パフォーマンス:詳細については

|     |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を参照してください。