You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:09:03