func myFunction(args: Int...) {
// Do something
}
func testMyFunction() -> String {
// Wrap the call to myFunction here, and optionally test with different arguments
myFunction(args: 1, 2, 3)
return #function
}
// Measure average time to complete test
func averageTimeTo(_ testFunction: () -> String, repeated reps: UInt = 10) -> Double {
let functionName = testFunction()
var totalTime = 0.0
for _ in 0..<reps {
let startTime = CFAbsoluteTimeGetCurrent()
testFunction()
let elapsedTime = CFAbsoluteTimeGetCurrent() - startTime
totalTime += elapsedTime
}
let averageTime = totalTime / Double(reps)
print("Total time to (functionName) (reps) times: (totalTime) seconds")
print("Average time to (functionName): (averageTime) secondsn")
return averageTime
}
averageTimeTo(testMyFunction)
// Total time to testMyFunction() 10 times: 0.000253915786743164 seconds
// Average time to testMyFunction(): 2.53915786743164e-05 seconds
averageTimeTo(testMyFunction, repeated: 1000)
// Total time to testMyFunction() 1000 times: 0.027538537979126 seconds
// Average time to testMyFunction(): 2.7538537979126e-05 seconds
@discardableResult func printTimeElapsedWhenRunningCode<T>(title: String, operation: () -> T) -> T {
let startTime = CFAbsoluteTimeGetCurrent()
let result = operation()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time elapsed for (title): (timeElapsed) s.")
return result
}
9条答案
按热度按时间u59ebvdq1#
如果您只想为代码块提供独立的计时函数,我可以使用以下SWIFT助手函数:
前者将注销给定代码段所需的时间,后者以浮点数的形式返回该时间。作为第一个变体的示例:
将注销类似以下内容:
MAP()所用时间:0.0617449879646301秒
请注意Swift benchmarks will vary heavily based on the level of optimization you select,因此这可能仅对SWIFT执行时间的相对比较有用。即使是在每个测试版的基础上,这种情况也可能会发生变化。
r6l8ljro2#
如果您想深入了解某个代码块的性能,并确保在进行编辑时性能不会受到影响,最好的方法是使用XCTest's测量性能函数,如
measure(_ block: () -> Void)
。编写一个单元测试来执行您想要进行基准测试的方法,该单元测试将多次运行它,给出所需的时间和结果的偏差
您可以在正在使用Xcode进行测试的Apple文档中找到更多信息->性能测试
qoefvg9y3#
您可以使用此函数来测量异步和同步代码:
因此,基本上是传递一个接受函数作为参数的块,用它来告诉MEASURE何时结束。
例如,要测量某个名为“myAsyncCall”的调用需要多长时间,您可以这样称呼它:
对于同步代码:
这应该类似于XCTest中的measure Block,尽管我不知道它是如何在那里实现的。
wbgh16ku4#
标杆功能--SWIFT 4.2
这是一个非常通用的基准测试函数,它允许标记测试、执行多个测试并平均它们的执行时间、在测试之间调用设置块(即在测量其上的排序算法之间洗牌一个数组)、清楚地打印基准测试结果,并且它还以
Double
的形式返回平均执行时间。尝试以下操作:
使用方法
注意:
measure
还返回执行时间。label
、tests
和setup
参数是可选的。默认情况下,printResults
参数设置为true
。vatpfxk55#
我喜欢布拉德·拉森对一项简单测试的回答,你甚至可以在Playground上运行。为了我自己的需要,我对它做了一些调整:
1.我已经将对我想要测试的函数的调用 Package 在一个测试函数中,这为我提供了空间,如果我愿意的话,可以使用不同的参数。
1.测试函数返回其名称,因此我不必在
averageTimeTo()
基准函数中包含‘title’参数。1.基准功能允许您选择指定要执行的重复次数(默认为10次)。然后,它同时报告总时间和平均时间。
1.基准测试函数打印到控制台并返回
averageTime
(您可能会从名为‘verageTimeTo’的函数中预料到这一点),因此不需要两个功能几乎相同的独立函数。例如:
kg7wmglp6#
对@Brad Larsons的答案(接受的答案)进行了小小的改进,允许函数在需要时返回操作结果
bsxbgnwa7#
SWIFT代码执行基准
请在
Production
版本而不是Debug
上进行基准测试,因为它包含更多优化您有几种可能性
DispatchTime.now().uptimeNanoseconds
(和1_000_000上的div)基于马赫绝对时间单位
挂钟(不推荐,因为有闰秒或其他微校准)
Date().timeIntervalSince1970
CFAbsoluteTimeGetCurrent
测试
measure
块创建一般函数,因为Xcode有时无法正确处理它。这就是为什么每次性能测试都使用measure
数据块rsaldnfx8#
}
watbbzwu9#
A制作了一个很小的SPM包来测量代码执行时间:
https://github.com/mezhevikin/Measure.git
使用示例
控制台输出:
测量异步请求
包的完整代码: