Skip to content

Commit 498c222

Browse files
stephencelismluisbrown
authored andcommitted
Add benchmark for effect merging (#1310)
* Add benchmark for effect merging * wip * wip * wip (cherry picked from commit 2389b821a8ab1f4b549788ff1f4678cc6a2e75e4)
1 parent c5d1e08 commit 498c222

File tree

3 files changed

+86
-1
lines changed

3 files changed

+86
-1
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import Benchmark
2+
3+
extension BenchmarkSuite {
4+
func benchmark(
5+
_ name: String,
6+
run: @escaping () throws -> Void,
7+
setUp: @escaping () -> Void = {},
8+
tearDown: @escaping () -> Void
9+
) {
10+
self.register(
11+
benchmark: Benchmarking(name: name, run: run, setUp: setUp, tearDown: tearDown)
12+
)
13+
}
14+
}
15+
16+
struct Benchmarking: AnyBenchmark {
17+
let name: String
18+
let settings: [BenchmarkSetting] = []
19+
private let _run: () throws -> Void
20+
private let _setUp: () -> Void
21+
private let _tearDown: () -> Void
22+
23+
init(
24+
name: String,
25+
run: @escaping () throws -> Void,
26+
setUp: @escaping () -> Void = {},
27+
tearDown: @escaping () -> Void = {}
28+
) {
29+
self.name = name
30+
self._run = run
31+
self._setUp = setUp
32+
self._tearDown = tearDown
33+
}
34+
35+
func setUp() {
36+
self._setUp()
37+
}
38+
39+
func run(_ state: inout BenchmarkState) throws {
40+
try self._run()
41+
}
42+
43+
func tearDown() {
44+
self._tearDown()
45+
}
46+
}
47+
48+
@inline(__always)
49+
func doNotOptimizeAway<T>(_ x: T) {
50+
@_optimize(none)
51+
func assumePointeeIsRead(_ x: UnsafeRawPointer) {}
52+
53+
withUnsafePointer(to: x) { assumePointeeIsRead($0) }
54+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import Benchmark
2+
import Combine
3+
import ComposableArchitecture
4+
import Foundation
5+
6+
let effectSuite = BenchmarkSuite(name: "Effects") {
7+
$0.benchmark("Merged Effect.none (create, flat)") {
8+
doNotOptimizeAway(Effect<Int, Never>.merge((1...100).map { _ in .none }))
9+
}
10+
11+
$0.benchmark("Merged Effect.none (create, nested)") {
12+
var effect = Effect<Int, Never>.none
13+
for _ in 1...100 {
14+
effect = .merge(effect, .none)
15+
}
16+
doNotOptimizeAway(effect)
17+
}
18+
19+
let effect = Effect<Int, Never>.merge((1...100).map { _ in .none })
20+
var didComplete = false
21+
$0.benchmark("Merged Effect.none (sink)") {
22+
doNotOptimizeAway(
23+
effect.sink(receiveCompletion: { _ in didComplete = true }, receiveValue: { _ in })
24+
)
25+
} tearDown: {
26+
precondition(didComplete)
27+
}
28+
}

Sources/swift-composable-architecture-benchmark/main.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,7 @@ benchmark("Scoping (4)") {
3939
viewStore4.send(true)
4040
}
4141

42-
Benchmark.main()
42+
Benchmark.main([
43+
defaultBenchmarkSuite,
44+
effectSuite,
45+
])

0 commit comments

Comments
 (0)