Если вы хотите протестировать производительность, используйте блок модульных тестов. measure { ... }
- хорошая отправная точка, так как он запускает его несколько раз и рассчитывает прошедшее время, стандартное отклонение и т. Д.
Я бы также предложил:
- тестирование с типом, где сортировка является относительно эффективной (например,
[Int]
, а не [String]
), так что вы сосредотачиваетесь на скорости сортировки, а не на скорости сравнения);
- выполнить сортировку, которая имеет наблюдаемое время (например, большой массив) и повторять сортировку много раз; и
- Сделайте что-нибудь простое с конечным результатом, чтобы при тестировании оптимизированной сборки вы не рисковали, если бы она оптимизировала некоторый код, который генерирует результат, который вы не используете.
Но для быстрого тестирования производительности модульные тесты Xcode довольно просты. Например:
class MyAppTests: XCTestCase {
let iterationCount = 1_000
// build large array
var array = (0 ..< 1_000).map { _ in Int.random(in: 0 ..< 1_000_000) }
// test performance
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())
}