Skip to content

Commit

Permalink
Attempt to prevent throwing away unused values in Swift benchmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
akonradi-signal authored Dec 16, 2024
1 parent 4951219 commit 5a92f51
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ private let BENCHMARK_PLAINTEXT_SIZES = [100, 1000, 10000]

let privateKeyOperationsSuite = BenchmarkSuite(name: "PrivateKey") { suite in
suite.benchmark("generate") {
_ = PrivateKey.generate()
blackHole(PrivateKey.generate())
}

let privateKey = PrivateKey.generate()
for plaintextSize in BENCHMARK_PLAINTEXT_SIZES {
let bytes = Data((0..<plaintextSize).map { _ in UInt8.random(in: UInt8.min...UInt8.max) })
suite.benchmark("generateSignature/\(plaintextSize)bytes") {
_ = privateKey.generateSignature(message: bytes)
blackHole(privateKey.generateSignature(message: bytes))
}
}

let otherPublicKey = PrivateKey.generate().publicKey
suite.benchmark("keyAgreement") {
_ = privateKey.keyAgreement(with: otherPublicKey)
blackHole(privateKey.keyAgreement(with: otherPublicKey))
}
}

Expand All @@ -34,18 +34,18 @@ let publicKeyOperationsSuite = BenchmarkSuite(name: "PublicKey") { suite in
let publicKeyBytes = publicKey.serialize()

suite.benchmark("init") {
_ = try PublicKey(publicKeyBytes)
blackHole(try! PublicKey(publicKeyBytes))
}

suite.benchmark("serialize") {
_ = publicKey.serialize()
blackHole(publicKey.serialize())
}

for plaintextSize in BENCHMARK_PLAINTEXT_SIZES {
let bytes = Data((0..<plaintextSize).map { _ in UInt8.random(in: UInt8.min...UInt8.max) })
let signature = privateKey.generateSignature(message: bytes)
suite.benchmark("verifySignature/\(plaintextSize)") {
_ = try publicKey.verifySignature(message: bytes, signature: signature)
suite.benchmark("verifySignature/\(plaintextSize)bytes") {
blackHole(try! publicKey.verifySignature(message: bytes, signature: signature))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,16 @@ let groupSendEndorsementsSuite = BenchmarkSuite(name: "GroupSendEndorsements") {
let response = GroupSendEndorsementsResponse.issue(groupMembers: encryptedMembers, keyPair: keyPair)

suite.benchmark("receiveWithServiceIds/\(groupSize)") {
_ = try! response.receive(groupMembers: members, localUser: members[0], groupParams: groupParams, serverParams: serverPublicParams)
blackHole(try! response.receive(groupMembers: members, localUser: members[0], groupParams: groupParams, serverParams: serverPublicParams))
}
suite.benchmark("receiveWithCiphertexts/\(groupSize)") {
_ = try! response.receive(groupMembers: encryptedMembers, localUser: encryptedMembers[0], serverParams: serverPublicParams)
blackHole(try! response.receive(groupMembers: encryptedMembers, localUser: encryptedMembers[0], serverParams: serverPublicParams))
}

let endorsements = try! response.receive(groupMembers: members, localUser: members[0], groupParams: groupParams, serverParams: serverPublicParams)

suite.benchmark("toToken/\(groupSize)") {
_ = endorsements.endorsements.map { $0.toToken(groupParams: groupParams) }
blackHole(endorsements.endorsements.map { $0.toToken(groupParams: groupParams) })
}
}
}
11 changes: 11 additions & 0 deletions swift/Benchmarks/Sources/Benchmarks/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,14 @@ Benchmark.main([
privateKeyOperationsSuite,
publicKeyOperationsSuite,
])

/// Attempts to prevent the value of `x` from being discarded by the optimizer.
///
/// See https://github.com/google/swift-benchmark/issues/69
@inline(__always)
internal func blackHole<T>(_ x: T) {
@_optimize(none)
func assumePointeeIsRead(_: UnsafeRawPointer) {}

withUnsafePointer(to: x) { assumePointeeIsRead($0) }
}

0 comments on commit 5a92f51

Please sign in to comment.