Swift-regex vs components/join:哪一种对字符串操作更有效

Swift-regex vs components/join:哪一种对字符串操作更有效,swift,regex,string,Swift,Regex,String,我需要删除Swift中单词之间过多的空格(给定字符串中的单词不会超过5个),不确定哪一个更有效:正则表达式还是普通组件和联接 例如: Hello world! My name is Tom. 结果: Hello world! My name is Tom. 方法1: let result = input.components(separatedBy: " ").filter { string -> Bool in return string.isEmpty == f

我需要删除Swift中单词之间过多的空格(给定字符串中的单词不会超过5个),不确定哪一个更有效:正则表达式还是普通组件和联接

例如:

Hello   world! My name is     Tom.
结果:

Hello world! My name is Tom.
方法1:

let result = input.components(separatedBy: " ").filter { string -> Bool in
    return string.isEmpty == false
}.joined(separator: " ")
方法2:

let result = input.replacingOccurrences(of: "[ \t]+", with: " ", options: .regularExpression, range: range)

我运行了一些性能测试,将《罗密欧与朱丽叶》的整个脚本逐行输入这两个函数(请参阅)

我确实有点惊讶,正则表达式替换与组件/字符串操作几乎是一致的:正则表达式的速度只有2x慢:

|     Approach      | abs. running time | cpu time | Time to evaluate func | memory peak |
|-------------------|-------------------|----------|-----------------------|-------------|
| components/string | 0.21 sec          | 0.2 sec  | 0.11 sec              | 9 Mb        |
| regex replace     | 0.33 sec          | 0.36 sec | 0.21 sec              | 34 Mb       |
这并不意味着什么。可能唯一值得注意的区别是峰值内存消耗。但是,即使在合理数量的并行循环中运行regexreplace,也应该可以。尽管如此,始终使用真实代码运行您自己的测试

然而,底线是

使用您喜欢的代码,并且更易于阅读和维护


除非你有问题,否则表演是无关紧要的。您是在数千个字符串的循环中执行此操作,还是在单个字符串上执行此操作一次?@rmaddy一次执行大约3个字符串,因此我想没有明显的区别?如果您确实想知道,您可以运行一些性能测试(不要使用操场进行此测试),但要避免过早优化。使用您喜欢的代码,并发现更易于阅读和维护。请尝试!在示例项目(不是游乐场)中,将当前日期保留为开始日期,创建一个循环并执行100000次操作。然后获取经过的时间。比较两种方法。