已知缓冲区大小下,iOS Swift中NSMutableString与[Character]哪个效率更高?
两种字符缓冲转字符串实现的效率对比
我正在进行文本处理工作,需要将大量Character转换为字符串。输入为一段长Character序列,输出是根据特定规则从该序列生成的若干字符串。示例输入:
let input = "The quick brown fox jumps over a lazy dog."
想对比以下两种实现的效率:
第一种实现
let buffer = NSMutableString(capacity: MAX_SIZE) var result = [String]() for c in input { buffer.append(String(c)) if (isComplete(buffer)) { result.append(String(buffer)) buffer.deleteCharacters(in: NSRange(location: 0, length: buffer.length)) } }
第二种实现
var buffer = [Character]() var result = [String]() for c in input { buffer.append(c) if (isComplete(buffer)) { result.append(String(buffer)) buffer.removeAll() } }
我原本担心第一种指定了capacity能减少内存重分配,但实际第二种的效率要高得多,原因如下:
第一种实现的核心性能损耗:
- 每次循环都要把单个
Character转成String,频繁创建临时小字符串,带来不必要的内存开销和对象销毁成本 NSMutableString是Foundation框架的类型,和Swift原生的Character/String之间存在桥接开销,每次append和后续转成Swift String都要经过桥接,进一步拖慢速度- 虽然预分配了capacity,但上述两个问题的性能损耗远大于内存预分配带来的收益
- 每次循环都要把单个
第二种实现的优势(可进一步优化):
- 直接操作Swift原生的
[Character]数组,append字符时没有类型转换和桥接开销,操作更轻量 - 如果你担心内存重分配问题,只需要初始化数组时指定capacity即可:
var buffer = [Character](capacity: MAX_SIZE),这样数组会一次性分配足够的内存,避免扩容时的内存拷贝 - 转成
String时,String(buffer)是Swift原生API,直接从字符数组构建字符串,效率远高于从NSMutableString桥接转换的方式
- 直接操作Swift原生的
结论:第二种实现(初始化时指定capacity)的效率远高于第一种,完全不需要考虑第一种的内存预分配优势——它带来的收益根本抵消不了类型转换和桥接的开销。
内容的提问来源于stack exchange,提问作者Heuristic
相关产品推荐
相关产品推荐

