Skip to content

Commit 1f931f9

Browse files
authored
Merge pull request #5583 from lorentey/sr-3106.closure-benchmarks
[benchmark][SR-3106] Add benchmarks with 4 different Observers
2 parents 0471e10 + d751b83 commit 1f931f9

File tree

6 files changed

+154
-0
lines changed

6 files changed

+154
-0
lines changed

benchmark/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ set(SWIFT_BENCH_MODULES
6464
single-source/NSStringConversion
6565
single-source/NopDeinit
6666
single-source/ObjectAllocation
67+
single-source/ObserverClosure
68+
single-source/ObserverForwarderStruct
69+
single-source/ObserverPartiallyAppliedMethod
70+
single-source/ObserverUnappliedMethod
6771
single-source/OpenClose
6872
single-source/Phonebook
6973
single-source/PolymorphicCalls
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
class Observer {
3+
@inline(never)
4+
func receive(_ value: Int) {
5+
}
6+
}
7+
8+
class Signal {
9+
var observers: [(Int) -> ()] = []
10+
11+
func subscribe(_ observer: @escaping (Int) -> ()) {
12+
observers.append(observer)
13+
}
14+
15+
func send(_ value: Int) {
16+
for observer in observers {
17+
observer(value)
18+
}
19+
}
20+
}
21+
22+
public func run_ObserverClosure(_ iterations: Int) {
23+
let signal = Signal()
24+
let observer = Observer()
25+
for _ in 0 ..< 10_000 * iterations {
26+
signal.subscribe { i in observer.receive(i) }
27+
}
28+
signal.send(1)
29+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
2+
class Observer {
3+
@inline(never)
4+
func receive(_ value: Int) {
5+
}
6+
}
7+
8+
protocol Sink {
9+
func receive(_ value: Int)
10+
}
11+
12+
struct Forwarder: Sink {
13+
let object: Observer
14+
15+
func receive(_ value: Int) {
16+
object.receive(value)
17+
}
18+
}
19+
20+
class Signal {
21+
var observers: [Sink] = []
22+
23+
func subscribe(_ sink: Sink) {
24+
observers.append(sink)
25+
}
26+
27+
func send(_ value: Int) {
28+
for observer in observers {
29+
observer.receive(value)
30+
}
31+
}
32+
}
33+
34+
public func run_ObserverForwarderStruct(_ iterations: Int) {
35+
let signal = Signal()
36+
let observer = Observer()
37+
for _ in 0 ..< 10_000 * iterations {
38+
signal.subscribe(Forwarder(object: observer))
39+
}
40+
signal.send(1)
41+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
class Observer {
3+
@inline(never)
4+
func receive(_ value: Int) {
5+
}
6+
}
7+
8+
class Signal {
9+
var observers: [(Int) -> ()] = []
10+
11+
func subscribe(_ observer: @escaping (Int) -> ()) {
12+
observers.append(observer)
13+
}
14+
15+
func send(_ value: Int) {
16+
for observer in observers {
17+
observer(value)
18+
}
19+
}
20+
}
21+
22+
public func run_ObserverPartiallyAppliedMethod(_ iterations: Int) {
23+
let signal = Signal()
24+
let observer = Observer()
25+
for _ in 0 ..< 10_000 * iterations {
26+
signal.subscribe(observer.receive)
27+
}
28+
signal.send(1)
29+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
class Observer {
3+
@inline(never)
4+
func receive(_ value: Int) {
5+
}
6+
}
7+
8+
protocol Sink {
9+
func receive(_ value: Int)
10+
}
11+
12+
struct Forwarder<Object>: Sink {
13+
let object: Object
14+
let method: (Object) -> (Int) -> ()
15+
16+
func receive(_ value: Int) {
17+
method(object)(value)
18+
}
19+
}
20+
21+
class Signal {
22+
var observers: [Sink] = []
23+
24+
func subscribe(_ sink: Sink) {
25+
observers.append(sink)
26+
}
27+
28+
func send(_ value: Int) {
29+
for observer in observers {
30+
observer.receive(value)
31+
}
32+
}
33+
}
34+
35+
public func run_ObserverUnappliedMethod(_ iterations: Int) {
36+
let signal = Signal()
37+
let observer = Observer()
38+
for _ in 0 ..< 10_000 * iterations {
39+
let forwarder = Forwarder(object: observer, method: Observer.receive)
40+
signal.subscribe(forwarder)
41+
}
42+
signal.send(1)
43+
}

benchmark/utils/main.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ import ObjectAllocation
6868
import ObjectiveCBridging
6969
import ObjectiveCBridgingStubs
7070
import ObjectiveCNoBridgingStubs
71+
import ObserverClosure
72+
import ObserverForwarderStruct
73+
import ObserverPartiallyAppliedMethod
74+
import ObserverUnappliedMethod
7175
import OpenClose
7276
import Phonebook
7377
import PolymorphicCalls
@@ -197,6 +201,10 @@ precommitTests = [
197201
"ObjectiveCBridgeToNSDictionary": run_ObjectiveCBridgeToNSDictionary,
198202
"ObjectiveCBridgeToNSSet": run_ObjectiveCBridgeToNSSet,
199203
"ObjectiveCBridgeToNSString": run_ObjectiveCBridgeToNSString,
204+
"ObserverClosure": run_ObserverClosure,
205+
"ObserverForwarderStruct": run_ObserverForwarderStruct,
206+
"ObserverPartiallyAppliedMethod": run_ObserverPartiallyAppliedMethod,
207+
"ObserverUnappliedMethod": run_ObserverUnappliedMethod,
200208
"OpenClose": run_OpenClose,
201209
"Phonebook": run_Phonebook,
202210
"PolymorphicCalls": run_PolymorphicCalls,

0 commit comments

Comments
 (0)