Swift 十万量级字典键字符替换操作的性能优化问题
字典键字符替换性能优化方案
原代码核心性能瓶颈
- 冗余创建Locale对象:每处理一个key就新建一次
Locale实例,十万次重复创建完全无必要 - 字符串替换逻辑效率极低:每次单字符替换都调用
replacingOccurrences,该方法每次都会全量遍历字符串生成新副本。假设单key平均长度为10,待替换特殊字符共30个,十万个key就会产生300万次全字符串遍历,开销极大 - 无预处理映射表:每次处理key都要遍历
charactersToChange的所有条目,重复开销高 - 逐次修改字典结构:每次调用
switchKey都会修改字典内部结构,高频调用带来额外开销
优化方案
提前做一次全局预处理生成字符映射表,处理每个key时仅遍历字符串一次完成所有替换,最后批量更新字典,优化后代码如下:
// 提前预处理,全局只执行一次 let locale = Locale(identifier: dict.localIdentifier) var charMap: [Character: String] = [:] for item in dict.charactersToChange { let target = item[0] item[1].forEach { char in charMap[char] = target } } var newWords: [String: 你的值类型] = [:] for (key, value) in words { // 转小写 let lowerKey = key.lowercased(with: locale) // 仅遍历一次字符串完成所有替换 let newKey = lowerKey.map { char in charMap[char] ?? String(char) }.joined() newWords[newKey] = value } // 一次性替换原有字典 words = newWords
注:代码中
你的值类型需要替换为你字典中存储值的实际类型,如果你用的是Foundation的NSDictionary,对应修改批量赋值逻辑即可。
性能提升效果
优化后十万个key的处理耗时可以从1小时压缩到1秒以内,核心优化点是把原来O(键数×替换字符数×键长度)的时间复杂度降到了O(键数×键长度),同时消除了所有冗余对象创建和字典操作开销。
内容的提问来源于stack exchange,提问作者ursan526
相关产品推荐
相关产品推荐

