Swift宝宝起名应用筛选结果运行缓慢性能问题优化咨询
宝宝起名App筛选性能优化方案
核心优化点(按收益从高到低排序)
- 所有语种名字库改用
Set类型存储
你当前代码里的dutchboy/englishgirl等如果是Array数组,contains方法时间复杂度是O(n),每判断一个名字就要遍历整个名单。改成Set后contains是O(1)常数时间,这一步就能砍掉90%以上的耗时。 - 合并所有筛选逻辑,只遍历一次姓名列表
原代码每加一个筛选规则就调用一次filter,相当于5000条的列表要被遍历十几次。改成单次遍历每个名字,一次性判断所有筛选条件,符合要求才保留,遍历次数直接从十几次降到1次。 - 提前缓存用户配置,避免重复解包
不用每次调用apply方法都重新从allSavedSettings里解包布尔值,用户修改设置的时候提前算好最终的筛选规则,后续调用直接用缓存好的规则就行。 - 优化长度判断逻辑
原代码的长短名判断可以合并成一个长度区间条件,避免冗余判断。
优化后代码示例
// 提前初始化所有名字库为Set,App启动/配置更新时只做一次 let dutchNames: Set<String> = Set(dutchboy + dutchgirl) let englishNames: Set<String> = Set(englishboy + englishgirl) let arabicNames: Set<String> = Set(arabicboy + arabicgirl) let hebrewNames: Set<String> = Set(hebrewboby + hebrewgirl) let latinNames: Set<String> = Set(latinboy + latingirl) let chineseNames: Set<String> = Set(chineseboy + chinesegirl) let scandinavianNames: Set<String> = Set(scandinavianboy + scandinaviangirl) let spanishNames: Set<String> = Set(spanishboy + spanishgirl) // 提前缓存用户配置,设置变更时更新 struct FilterConfig { let allowShort: Bool let allowLong: Bool let allowDutch: Bool let allowEnglish: Bool let allowArabic: Bool let allowHebrew: Bool let allowLatin: Bool let allowChinese: Bool let allowScandinavian: Bool let allowSpanish: Bool } func apply(list: [String], config: FilterConfig) -> [String] { return list.filter { name in // 长度判断 let len = name.count if !config.allowShort, len <= 4 { return false } if !config.allowLong, len >= 5 { return false } // 语种判断 if !config.allowDutch, dutchNames.contains(name) { return false } if !config.allowEnglish, englishNames.contains(name) { return false } if !config.allowArabic, arabicNames.contains(name) { return false } if !config.allowHebrew, hebrewNames.contains(name) { return false } if !config.allowLatin, latinNames.contains(name) { return false } if !config.allowChinese, chineseNames.contains(name) { return false } if !config.allowScandinavian, scandinavianNames.contains(name) { return false } if !config.allowSpanish, spanishNames.contains(name) { return false } return true } }
额外可选优化
如果还有性能需求,可以提前给所有名字打好语种标签,存储的时候就把每个名字对应的语种属性带上,筛选的时候不需要查Set,直接判断标签是否允许即可,性能会更高。
内容的提问来源于stack exchange,提问作者patturik
相关产品推荐
相关产品推荐

