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 78 79 80 81
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2019 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 NIO
import NIOSSL
final class BenchManyWrites: Benchmark {
let clientContext: NIOSSLContext
let serverContext: NIOSSLContext
let dummyAddress: SocketAddress
let backToBack: BackToBackEmbeddedChannel
let loopCount: Int
let writeSize: Int
var buffer: ByteBuffer?
init(loopCount: Int, writeSizeInBytes writeSize: Int) throws {
self.loopCount = loopCount
self.writeSize = writeSize
self.serverContext = try NIOSSLContext(configuration: .makeServerConfiguration(
certificateChain: [.certificate(.forTesting())],
privateKey: .privateKey(.forTesting())
))
var clientConfig = TLSConfiguration.makeClientConfiguration()
clientConfig.trustRoots = try .certificates([.forTesting()])
self.clientContext = try NIOSSLContext(configuration: clientConfig)
self.dummyAddress = try SocketAddress(ipAddress: "1.2.3.4", port: 5678)
self.backToBack = BackToBackEmbeddedChannel()
}
func setUp() throws {
let serverHandler = NIOSSLServerHandler(context: self.serverContext)
let clientHandler = try NIOSSLClientHandler(context: self.clientContext, serverHostname: "localhost")
try self.backToBack.client.pipeline.addHandler(clientHandler).wait()
try self.backToBack.server.pipeline.addHandler(serverHandler).wait()
// To trigger activation of both channels we use connect().
try self.backToBack.client.connect(to: dummyAddress).wait()
try self.backToBack.server.connect(to: dummyAddress).wait()
try self.backToBack.interactInMemory()
self.buffer = self.backToBack.client.allocator.buffer(capacity: self.writeSize)
self.buffer!.writeBytes(repeatElement(0, count: self.writeSize))
}
func tearDown() { }
func run() throws -> Int {
guard let buffer = self.buffer else {
fatalError("Couldn't get buffer")
}
for _ in 0..<self.loopCount {
// A vector of 100 writes.
for _ in 0..<100 {
self.backToBack.client.write(buffer, promise: nil)
}
self.backToBack.client.flush()
try self.backToBack.interactInMemory()
// Pull any data out of the server to avoid ballooning in memory.
while let _ = try self.backToBack.server.readInbound(as: ByteBuffer.self) { }
}
return self.loopCount
}
}
|