NSMutableString的-appendString:方法是一种构建大字符串的有效方法吗?

zem*_*zem 5 string cocoa cocoa-touch objective-c

我计划通过迭代集合并一次生成块来构建一个可能很大的字符串.如果我只是简单地从一个NSMutableString开始并反复向它添加块,那么它是否合理有效地工作还是Schlemiel the Painter的情况?对我来说似乎有理由认为NSMutableString以避免这种情况的方式实现,但我在官方文档中找不到任何关于此的讨论,我想确定.

(现在我正在写这个,我意识到在这种情况下我可以构建一个NSArray字符串并使用-componentsJoinedByString:同样容易,但无论如何这都很好.)

Jen*_*ton 6

Schlemiel本身不会发生,因为所有内部NS/CFString表示都使用显式长度,就像所有理智的字符串实现一样.(这里提供 OS X 10.6.2中基本CoreFoundation类型源的稍微修改版本.)真正的问题是分配开销.

在发布的代码中,可变字符串的缓冲区一次增长50%,除非它们非常大(至少ULONG_MAX / 3UL),在实际情况下为重新分配提供O(log n)绑定.使用该NSArray方法应该导致单个分配.另一方面,如果你逐步构建字符串并在你去的时候释放它们,你可能会减少缓存/虚拟机抖动.

基本上,优化的黄金法则适用:如果基准测试显示问题(在大而实际的数据集上),请尝试两者.