更新
随着Swift 5.7的推出,下面的内容变得过时了。Swift 5.7引入了一个Clock的概念,该函数的设计正好可以满足此处所需。
提供了两个具体的Clock
示例:ContinuousClock
和SuspendingClock
。前者在系统挂起时继续运行,而后者则不会。
以下是在Swift 5.7中要做的示例。
func doSomething()
{
for i in 0 ..< 1000000
{
if (i % 10000 == 0)
{
print(i)
}
}
}
let clock = ContinuousClock()
let result = clock.measure(doSomething)
print(result) // On my laptop, prints "0.552065882 seconds"
当然,它还可以直接测量闭合。
let clock = ContinuousClock()
let result = clock.measure {
for i in 0 ..< 1000000
{
if (i % 10000 == 0)
{
print(i)
}
}
}
print(result)
Swift 5.7之前
这是我用Swift编写的一个函数,用于测量Project Euler问题。
自Swift 3以来,现在有一个“swiftified”版本的Grand Central Dispatch。因此,正确的答案可能是使用DispatchTime API。
我的函数大致如下:
func evaluateProblem(problemNumber: Int, problemBlock: () -> Int) -> Answer
{
print("Evaluating problem \(problemNumber)")
let start = DispatchTime.now()
let myGuess = problemBlock()
let end = DispatchTime.now()
let theAnswer = self.checkAnswer(answerNum: "\(problemNumber)", guess: myGuess)
let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
let timeInterval = Double(nanoTime) / 1_000_000_000
print("Time to evaluate problem \(problemNumber): \(timeInterval) seconds")
return theAnswer
}
旧答案
对于Swift 1和2,我的函数使用NSDate:
func evaluateProblem(problemNumber: Int, problemBlock: () -> Int) -> Answer
{
println("Evaluating problem \(problemNumber)")
let start = NSDate()
let myGuess = problemBlock()
let end = NSDate()
let theAnswer = self.checkAnswer(answerNum: "\(problemNumber)", guess: myGuess)
let timeInterval: Double = end.timeIntervalSinceDate(start)
println("Time to evaluate problem \(problemNumber): \(timeInterval) seconds")
return theAnswer
}
请注意,使用NSdate进行时间函数操作是不建议的:“
系统时间可能会因与外部时间参考的同步或时钟的显式用户更改而减少。”。
sqrt(number)
处停止,而不是在number
处停止,这样可以节省更多时间 - 但是还有更多优化寻找质数的想法。 - holexNSDate
对象并且可以测量它们之间的差异。 - holex