在SWIFT的ClosedRange
中,contains
方法似乎非常慢.
我在MacOS上创建了以下SWIFTplayground 进行测试:
import Foundation
func measure(fn: @escaping ()->Void) -> CFAbsoluteTime {
let startTime = CFAbsoluteTimeGetCurrent()
fn()
let endTime = CFAbsoluteTimeGetCurrent()
return endTime - startTime
}
let r1: ClosedRange<Int> = 1222450723...1308640992
let r2: ClosedRange<Int> = 41218238...462709950
let dt_a = measure { let _ = r1.lowerBound <= r2.lowerBound && r1.upperBound >= r2.upperBound }
let dt_b = measure { let _ = r1.contains(r2) }
contains
方法不应该简单地执行我在上面代码中对dt_a
执行的范围比较吗?
-
dt_a
给我95微秒,而 -
dt_b
给我326.9秒(~5.45分钟)
这比预期慢了340万倍.
它似乎在判断范围内的所有值,这是没有意义的. 这会不会是SWIFT的一个漏洞?或者这是意料之中的行为?
我使用的是Xcode 15.0.1(SWIFT 5)
(*)注:对于上下文,我在解决2023 Advent of Code Day 5的第2部分时发现了这一点
在一个真实的项目中,在开启优化的情况下发布构建(Optimize for speed [-O]
),dt_b
给了我356秒,比在操场上还差……