cStrings (データベースから取得したもの) から多くの NSString オブジェクトをできるだけ早く割り当てる必要があります。cStringUsingEncoding などは遅すぎます。cString の割り当てに比べて約 10 ~ 15 倍遅くなります。
ただし、NSString を使用して NSString を作成すると、cString の割り当てにかなり近づきます (1M の割り当てで約 1.2 秒)。編集: 文字列のコピーを使用するように割り当てを修正しました。
const char *n;
const char *s = "Office für iPad: Steve Ballmer macht Hoffnung";
NSString *str = [NSString stringWithUTF8String:s];
int len = strlen(s);
for (int i = 0; i<10000000; i++) {
NSString *s = [[NSString alloc] initWithString:[str copy]];
s = s;
}
cString 割り当てテスト (1M 割り当ての場合も約 1 秒):
for (int i = 0; i<10000000; i++) {
n = malloc(len);
memccpy((void*)n, s, 0, len) ;
n = n;
free(n);
}
しかし、私が言ったように、stringWithCString などを使用すると、桁違いに遅くなります。私が得ることができた最速は、initWithBytesNoCopy を使用することでした (約 8 秒、したがって、stringWithString と比較して 8 倍遅くなります):
NSString *so = [[NSString alloc] initWithBytesNoCopy:(void*)n length:len encoding:NSUTF8StringEncoding freeWhenDone:YES];
では、cStrings からの割り当てを高速化する別の魔法の方法はありますか? NSString をサブクラス化することも除外しません (もちろん、それがクラスター クラスであることはわかっています)。
編集:楽器では、NSString の CFStringUsingByteStream3 への呼び出しが根本的な問題であることがわかります。
編集 2: 根本的な問題は、instuments __CFFromUTF8 によるものです。ソース [1] を見るだけで、これは確かに非常に非効率的で、一部のレガシー ケースを処理しているようです。
https://www.opensource.apple.com/source/CF/CF-476.17/CFBuiltinConverters.c?txt