diff --git a/Sources/NIOPerformanceTester/LockBenchmark.swift b/Sources/NIOPerformanceTester/LockBenchmark.swift new file mode 100644 index 00000000..0315acb9 --- /dev/null +++ b/Sources/NIOPerformanceTester/LockBenchmark.swift @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftNIO open source project +// +// Copyright (c) 2021 Apple Inc. and the SwiftNIO project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftNIO project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import NIOCore +import NIOPosix +import Dispatch +import NIOConcurrencyHelpers + +final class LockBenchmark: Benchmark { + private let numberOfThreads: Int + private let lockOperationsPerThread: Int + private let threadPool: NIOThreadPool + private let group: EventLoopGroup + private let sem1 = DispatchSemaphore(value: 0) + private let sem2 = DispatchSemaphore(value: 0) + private let sem3 = DispatchSemaphore(value: 0) + private var opsDone = 0 + + private let lock = Lock() + + init(numberOfThreads: Int, lockOperationsPerThread: Int) { + self.numberOfThreads = numberOfThreads + self.lockOperationsPerThread = lockOperationsPerThread + self.threadPool = NIOThreadPool(numberOfThreads: numberOfThreads) + self.group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + } + + func setUp() throws { + self.threadPool.start() + } + + func tearDown() { + try! self.threadPool.syncShutdownGracefully() + try! self.group.syncShutdownGracefully() + } + + func run() throws -> Int { + self.lock.withLock { + self.opsDone = 0 + } + for _ in 0..(iterations: 1_000_000)) + +try measureAndPrint(desc: "lock_1_thread_10M_ops", + benchmark: LockBenchmark(numberOfThreads: 1, lockOperationsPerThread: 10_000_000)) + +try measureAndPrint(desc: "lock_2_threads_10M_ops", + benchmark: LockBenchmark(numberOfThreads: 2, lockOperationsPerThread: 5_000_000)) + +try measureAndPrint(desc: "lock_4_threads_10M_ops", + benchmark: LockBenchmark(numberOfThreads: 4, lockOperationsPerThread: 2_500_000)) + +try measureAndPrint(desc: "lock_8_threads_10M_ops", + benchmark: LockBenchmark(numberOfThreads: 8, lockOperationsPerThread: 1_250_000)) + +