//===--- ArrayAppend.swift ------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // This test checks the performance of appending to an array. // // Note: Several benchmarks are marked .unstable until we have a way // of controlling malloc behavior from the benchmark driver. import TestsUtils let t: [BenchmarkCategory] = [.validation, .api, .Array] public let benchmarks = [ BenchmarkInfo(name: "ArrayAppend", runFunction: run_ArrayAppend, tags: t + [.unstable], legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendArrayOfInt", runFunction: run_ArrayAppendArrayOfInt, tags: t, setUpFunction: ones, tearDownFunction: releaseOnes, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendAscii", runFunction: run_ArrayAppendAscii, tags: t, legacyFactor: 34), BenchmarkInfo(name: "ArrayAppendAsciiSubstring", runFunction: run_ArrayAppendAsciiSubstring, tags: t, legacyFactor: 36), BenchmarkInfo(name: "ArrayAppendFromGeneric", runFunction: run_ArrayAppendFromGeneric, tags: t, setUpFunction: ones, tearDownFunction: releaseOnes, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendGenericStructs", runFunction: run_ArrayAppendGenericStructs, tags: t, setUpFunction: { otherStructs = Array(repeating: S(x: 3, y: 4.2), count: 10_000) }, tearDownFunction: { otherStructs = nil }, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendLatin1", runFunction: run_ArrayAppendLatin1, tags: t + [.unstable], legacyFactor: 34), BenchmarkInfo(name: "ArrayAppendLatin1Substring", runFunction: run_ArrayAppendLatin1Substring, tags: t, legacyFactor: 36), BenchmarkInfo(name: "ArrayAppendLazyMap", runFunction: run_ArrayAppendLazyMap, tags: t, setUpFunction: { blackHole(array) }, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendOptionals", runFunction: run_ArrayAppendOptionals, tags: t + [.unstable], setUpFunction: { otherOptionalOnes = Array(repeating: 1, count: 10_000) }, tearDownFunction: { otherOptionalOnes = nil }, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendRepeatCol", runFunction: run_ArrayAppendRepeatCol, tags: t + [.unstable], legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendReserved", runFunction: run_ArrayAppendReserved, tags: t, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendSequence", runFunction: run_ArrayAppendSequence, tags: t, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendStrings", runFunction: run_ArrayAppendStrings, tags: t, setUpFunction: { otherStrings = stride(from: 0, to: 10_000, by: 1).map { "\($0)" } }, tearDownFunction: { otherStrings = nil }, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendToFromGeneric", runFunction: run_ArrayAppendToFromGeneric, tags: t + [.unstable], setUpFunction: ones, tearDownFunction: releaseOnes, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendToGeneric", runFunction: run_ArrayAppendToGeneric, tags: t, setUpFunction: ones, tearDownFunction: releaseOnes, legacyFactor: 10), BenchmarkInfo(name: "ArrayAppendUTF16", runFunction: run_ArrayAppendUTF16, tags: t + [.unstable], legacyFactor: 34), BenchmarkInfo(name: "ArrayAppendUTF16Substring", runFunction: run_ArrayAppendUTF16Substring, tags: t, legacyFactor: 36), BenchmarkInfo(name: "ArrayPlusEqualArrayOfInt", runFunction: run_ArrayPlusEqualArrayOfInt, tags: t + [.unstable], setUpFunction: ones, tearDownFunction: releaseOnes, legacyFactor: 10), BenchmarkInfo(name: "ArrayPlusEqualFiveElementCollection", runFunction: run_ArrayPlusEqualFiveElementCollection, tags: t + [.unstable], legacyFactor: 37), BenchmarkInfo(name: "ArrayPlusEqualSingleElementCollection", runFunction: run_ArrayPlusEqualSingleElementCollection, tags: t, legacyFactor: 47), BenchmarkInfo(name: "ArrayPlusEqualThreeElements", runFunction: run_ArrayPlusEqualThreeElements, tags: t, legacyFactor: 10), ] var otherOnes: [Int]! var otherOptionalOnes: [Int?]! var otherStrings: [String]! var otherStructs: [S]! let array = Array(0..<10_000) func ones() { otherOnes = Array(repeating: 1, count: 10_000) } func releaseOnes() { otherOnes = nil } // Append single element @inline(never) public func run_ArrayAppend(_ n: Int) { for _ in 0.. { var x: T var y: U } // Append another array. Length of sequence known so // can pre-reserve capacity. @inline(never) public func run_ArrayAppendGenericStructs(_ n: Int) { let other: [S] = otherStructs for _ in 0..]() for _ in 0..<8 { nums += other } } } // Append another array. Length of sequence known so // can pre-reserve capacity. @inline(never) public func run_ArrayAppendOptionals(_ n: Int) { let other: [Int?] = otherOptionalOnes for _ in 0..(array: inout [S.Element], sequence: S) { array.append(contentsOf: sequence) } @inline(never) public func run_ArrayAppendFromGeneric(_ n: Int) { let other: [Int] = otherOnes for _ in 0..(collection: inout R, array: [R.Element]) { collection.append(contentsOf: array) } @inline(never) public func run_ArrayAppendToGeneric(_ n: Int) { let other: [Int] = otherOnes for _ in 0..(collection: inout R, sequence: S) where R.Element == S.Element { collection.append(contentsOf: sequence) } @inline(never) public func run_ArrayAppendToFromGeneric(_ n: Int) { let other: [Int] = otherOnes for _ in 0..