Avatar
@swift-5.3.3 -O import Foundation func measure(_ body: () -> Void) { let start = Date.timeIntervalSinceReferenceDate for _ in 0 ..< 10 { body() } let end = Date.timeIntervalSinceReferenceDate print((end - start) / 10) } extension Array { mutating func mySwapAt(_ i: Int, _ j: Int) { let t = self[i] self[i] = self[j] self[j] = t } } func swapBySwapAt(_ array: inout [Int]) { for i in array.indices.dropFirst() { array.swapAt(i - 1, i) } } func swapByT(_ array: inout [Int]) { for i in array.indices.dropFirst() { let t = array[i] array[i] = array[i - 1] array[i - 1] = t } } func swapByMySwapAt(_ array: inout [Int]) { for i in array.indices.dropFirst() { array.mySwapAt(i - 1, i) } } let n: Int = 10_000_000 + (1 ... 100).randomElement()! var a: [Int] = Array(1 ... n) measure { swapBySwapAt(&a) } measure { swapByT(&a) } measure { swapByMySwapAt(&a) } print(a.count)