[iPhone SDK] 多数の文字列を高速に書き出す試み
2tchではスレッドデータを保存する必要がある.
たとえば,今のv4のフォーマットだと,レイアウト情報込みのスレッドのデータは,1000〜1500個くらいのデータくらいからなる.
これをそのままNSCoderやNSDictionaryで書き出すと遅い.
Obj-Cのクラスのallocも少ないし,直接ファイルに書き出せることから,バイナリ形式で書き出すと爆速になると予測.
反面,バイナリ形式は,当然汎用性が下がるし,コードやデータのの可搬性も下がってしまう(まぁ,でもどうせ2tchでしか読み書きしないわけだから,バイナリでもさして将来的には困らないだろう).
そこで,速度を上げるために直接バイナリ形式で書き出してみた.100kB〜200kBくらいのデータだと,バイナリで書き出した方が6倍くらい速かった.
今回は,int型とNSStringのデータだけだったので,fread, fwriteで読み出しと書き出しを実装してみた.まずは,書き込んだバイト数をint型で書き出して,次にNSStringの中身をバイト単位で書き出す.
読み出すときは,以下のコードの逆でintをfreadで読み出して,次にbyteLength分のデータをfreadで読み出して,NSStringをallocする.
lengthOfBytesUsingEncodingを使っているのは,lengthメソッドはUnicodeを解釈した後の長さなので,バイト単位で書き出すときの長さにはならないためである.
〜バイト単位でそのまま書き出す方法
char *p = (char*)[string cStringUsingEncoding:NSUTF8StringEncoding]; int byteLength = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; fwrite( &byteLength, sizeof(byteLength), 1, fp); fwrite( p, sizeof(char), byteLength, fp);
他には,Unicode型?のunichar型を使って生データをNSStringから作る方法もある.
unichar *p = NULL; int length = [string length]; p = (unichar*)malloc( sizeof(unichar) * ( length ) ); [string getCharacters:p]; fwrite( &length, sizeof(length), 1, fp); fwrite( p, sizeof(unichar), length, fp); free( p );
この場合は,lengthで長さを使ってバッファの長さをきめることが出来る.