- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我计划通过遍历集合并一次生成 block 来构建一个可能很大的字符串。如果我只是简单地从一个 NSMutableString 开始并重复向它附加 block ,那么它是否有效地工作或者它是一个 Schlemiel the Painter情况?在我看来,NSMutableString 的实现方式似乎可以避免这种情况,但我在官方文档中找不到任何对此的讨论,我想确定一下。
(现在我正在写这篇文章,我意识到在这种情况下我可以构建一个 NSArray 字符串并使用 -componentsJoinedByString: 一样容易,但无论如何知道这将是一件好事。)
最佳答案
Schlemiel 情况本身不会发生,因为所有内部 NS/CFString 表示都使用显式长度,就像所有理智的字符串实现一样。 (来自 OS X 10.6.2 的基本 CoreFoundation 类型源的稍微修改版本可用 here。)真正的问题是分配开销。
在发布的代码中,可变字符串的缓冲区一次增长 50%,除非它们非常大(至少 ULONG_MAX/3UL
),在重新分配时给出 O(log n) 界限对于实际场景。使用 NSArray
方法应该会导致单个分配。另一方面,如果您分段构建字符串并在构建过程中释放这些片段,您可能会减少缓存/VM 抖动。
因此,基本上,优化的黄金法则适用:如果基准测试显示出问题(在大型但现实的数据集上),请尝试两者。
关于objective-c - 是NSMutableString的-appendString : method an efficient way to build up a large string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730147/
我是一名优秀的程序员,十分优秀!