1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
//===--- ProtocolDispatch.swift -------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2020 - 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
//
//===----------------------------------------------------------------------===//
import TestsUtils
public let benchmarks =
BenchmarkInfo (
name: "ProtocolConformance",
runFunction: run_ProtocolConformance,
tags: [.validation, .runtime])
protocol P {}
struct One: P {}
struct Two {}
struct Cat<T, U> {}
extension Cat: P where T: P, U: P {}
protocol Growable {}
extension Growable {
func grow() -> (Growable, Growable) {
return (Cat<Self, One>(), Cat<Self, Two>())
}
}
extension One: Growable {}
extension Two: Growable {}
extension Cat: Growable {}
@inline(never)
public func run_ProtocolConformance(_ n: Int) {
var array: [Growable] = [One(), Two()]
var i = 0
var checks = 0
// The expected number of times we expect `elt is P` to be true.
var expectedConforms = 0
// The expected number of times we expect `elt is P` to be true
// per iteration, at the current time.
var expectedConformsPerIter = 1
// The number of times we've actually seen `elt is P` be true.
var conforms = 0
while checks < n * 500 {
let (a, b) = array[i].grow()
array.append(a)
array.append(b)
// The number of times `elt is P` is true per outer iteration
// goes up by 1 when the array's count is a power of 2.
if array.count & (array.count - 1) == 0 {
expectedConformsPerIter += 1
}
expectedConforms += expectedConformsPerIter
for elt in array {
if elt is P {
conforms += 1
}
checks += 1
}
i += 1
}
check(expectedConforms == conforms)
}
|