如果你想衡量性能,请使用单元测试的
measure { ... }
代码块作为起点,因为它会运行多次并计算经过的时间、标准偏差等等。
我还建议:
- 使用一种相对高效的类型来测试 (例如
[Int]
而不是
[String]
), 这样可以更专注于排序速度而非比较速度;
- 进行可观察的排序测试(例如一个大数组)并重复多次进行排序;
- 最后对结果进行简单处理,如此将即使您测试了优化构建,也不会有风险将一些生成但未被使用的代码优化掉。
但是,对于快速的性能测试,Xcode 单元测试非常简便。例如:
class MyAppTests: XCTestCase {
let iterationCount = 1_000
var array = (0 ..< 1_000).map { _ in Int.random(in: 0 ..< 1_000_000) }
func testSortPerformance() {
measure {
for _ in 0 ..< iterationCount {
let results = array.sorted()
XCTAssert(!results.isEmpty)
}
}
}
func testBubbleSortPerformance() {
measure {
for _ in 0 ..< iterationCount {
let results = array.bubbleSorted()
XCTAssert(!results.isEmpty)
}
}
}
}
这将在报告导航器中产生以下结果:
或者在控制台中,您将看到详细信息:
/.../MyAppTests.swift:33: Test Case '-[MyAppTests.MyAppTests testBubbleSortPerformance]' measured [Time, seconds] average: 0.603, relative standard deviation: 3.284%, values: [0.613748, 0.580443, 0.590879, 0.586842, 0.626791, 0.610288, 0.595295, 0.588713, 0.594823, 0.647156], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
/.../MyAppTests.swift:23: Test Case '-[MyAppTests.MyAppTests testSortPerformance]' measured [Time, seconds] average: 0.025, relative standard deviation: 13.393%, values: [0.033849, 0.026869, 0.022752, 0.023048, 0.023024, 0.022847, 0.023286, 0.023987, 0.023803, 0.022640], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
顺便说一下,我可能也会测试排序算法本身,例如确保结果是递增的值,并且所有项目的总和仍然加起来:
func testBubbleSort() {
let results = array.bubbleSorted()
var previous = results[0]
for index in 1 ..< results.count {
let current = results[index]
XCTAssertLessThanOrEqual(previous, current)
previous = current
}
XCTAssertEqual(results.sum(), array.sum())
}