我需要尽可能快地从 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 分配也大约 1s):
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:根本问题是根据仪器__CFFromUTF8。仅查看来源 [1],这似乎确实效率很低并且处理了一些遗留案例。
https://www.opensource.apple.com/source/CF/CF-476.17/CFBuiltinConverters.c?txt