diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index f41c9db3f1c..8ba0050e0d7 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -45,6 +45,7 @@ set(SWIFT_BENCH_MODULES single-source/Breadcrumbs single-source/BucketSort single-source/BufferFill + single-source/BufferFind single-source/ByteSwap single-source/COWTree single-source/COWArrayGuaranteedParameterOverhead diff --git a/benchmark/single-source/BufferFind.swift b/benchmark/single-source/BufferFind.swift new file mode 100644 index 00000000000..ec556ba96c6 --- /dev/null +++ b/benchmark/single-source/BufferFind.swift @@ -0,0 +1,108 @@ +//===--- BufferFind.swift -------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 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 var benchmarks: [BenchmarkInfo] = [ + // size 1000, alignment 0 + BenchmarkInfo( + name: "RawBuffer.1000.findFirst", + runFunction: run_BufferFindFirst, + tags: [.validation, .api], + setUpFunction: buffer1000Setup, + tearDownFunction: bufferTeardown + ), + BenchmarkInfo( + name: "RawBuffer.1000.findLast", + runFunction: run_BufferFindLast, + tags: [.validation, .api], + setUpFunction: buffer1000Setup, + tearDownFunction: bufferTeardown + ), + // size 15, alignment 0 + BenchmarkInfo( + name: "RawBuffer.15.findFirst", + runFunction: run_BufferFindFirst, + tags: [.validation, .api], + setUpFunction: buffer15Setup, + tearDownFunction: bufferTeardown + ), + BenchmarkInfo( + name: "RawBuffer.15.findLast", + runFunction: run_BufferFindLast, + tags: [.validation, .api], + setUpFunction: buffer15Setup, + tearDownFunction: bufferTeardown + ), + // size 7, alignment 0 + BenchmarkInfo( + name: "RawBuffer.7.findFirst", + runFunction: run_BufferFindFirst, + tags: [.validation, .api], + setUpFunction: buffer7Setup, + tearDownFunction: bufferTeardown + ), + BenchmarkInfo( + name: "RawBuffer.7.findLast", + runFunction: run_BufferFindLast, + tags: [.validation, .api], + setUpFunction: buffer7Setup, + tearDownFunction: bufferTeardown + ) +] + +var buffer: UnsafeMutableRawBufferPointer = .init(start: nil, count: 0) + +func buffer1000Setup() { + bufferSetup(size: 1000, alignment: 0) +} + +func buffer15Setup() { + bufferSetup(size: 15, alignment: 0) +} + +func buffer7Setup() { + bufferSetup(size: 7, alignment: 0) +} + +func bufferTeardown() { + buffer.deallocate() + buffer = .init(start: nil, count: 0) +} + +func bufferSetup(size: Int, alignment: Int) { + buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: size, alignment: alignment) + buffer.initializeMemory(as: UInt8.self, repeating: UInt8.min) + buffer[size / 2] = UInt8.max +} + +@inline(never) +public func run_BufferFindFirst(n: Int) { + var offset = 0 + for _ in 0 ..< n * 10_000 { + if let index = buffer.firstIndex(of: UInt8.max) { + offset += index + } + } + blackHole(offset) +} + +@inline(never) +public func run_BufferFindLast(n: Int) { + var offset = 0 + for _ in 0 ..< n * 10_000 { + if let index = buffer.lastIndex(of: UInt8.max) { + offset += index + } + } + blackHole(offset) +} diff --git a/benchmark/utils/main.swift b/benchmark/utils/main.swift index 50b31b69818..47026b7a3d9 100644 --- a/benchmark/utils/main.swift +++ b/benchmark/utils/main.swift @@ -33,6 +33,7 @@ import BitCount import Breadcrumbs import BucketSort import BufferFill +import BufferFind import ByteSwap import COWTree import COWArrayGuaranteedParameterOverhead @@ -221,6 +222,7 @@ register(BitCount.benchmarks) register(Breadcrumbs.benchmarks) register(BucketSort.benchmarks) register(BufferFill.benchmarks) +register(BufferFind.benchmarks) register(ByteSwap.benchmarks) register(COWTree.benchmarks) register(COWArrayGuaranteedParameterOverhead.benchmarks)