Swift中Sequence.map为何采用ContiguousArray实现而非直接用Array?
为什么Swift标准库中Sequence.map用ContiguousArray而非直接用Array实现?
在Swift标准库的Sequence.map实现里,开发者选择先创建ContiguousArray完成元素填充,再转为Array返回,而非直接用Array逐步填充,核心原因是性能优化,具体可以从这几点理解:
更低的内存与操作开销:
Array是支持与Objective-C桥接的容器,内部带有isa指针、桥接元数据等额外结构,这会带来少量的内存开销和操作损耗。而ContiguousArray是纯Swift环境下的连续内存容器,没有桥接相关的额外成本,在仅需纯Swift内部操作时,性能表现更优。高效的内存预分配与填充:
实现中先通过underestimatedCount获取序列的预估元素数量,给ContiguousArray预留初始容量,避免了数组扩容时的内存重新分配与元素拷贝。接着通过两次循环填充:先用for循环处理预估数量内的元素,再用while循环处理超出预估的剩余元素,既保证了预分配内存的充分利用,也不会遗漏任何元素。低开销的类型转换:
最后将ContiguousArray转为Array的成本极低——两者底层都是连续内存存储,这个转换只是简单的类型包装,不会触发内存复制,完全不会抵消之前的性能收益。
对应的标准库实现代码:
@inlinable public func map<T>( _ transform: (Element) throws -> T ) rethrows -> [T] { let initialCapacity = underestimatedCount var result = ContiguousArray<T>() result.reserveCapacity(initialCapacity) var iterator = self.makeIterator() for _ in 0..<initialCapacity { result.append(try transform(iterator.next()!)) } while let element = iterator.next() { result.append(try transform(element)) } return Array(result) }
内容的提问来源于stack exchange,提问作者Pogos Anesyan
相关产品推荐
相关产品推荐

