Skip to content

Commit c4f9c57

Browse files
committed
Adds Benchmarks.
1 parent 76586b8 commit c4f9c57

File tree

7 files changed

+580
-100
lines changed

7 files changed

+580
-100
lines changed

Rx.xcodeproj/project.pbxproj

Lines changed: 195 additions & 34 deletions
Large diffs are not rendered by default.

Tests/Benchmarks/Benchmarks.swift

Lines changed: 326 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,326 @@
1+
//
2+
// Benchmarks.swift
3+
// Tests
4+
//
5+
// Created by Krunoslav Zaher on 1/15/17.
6+
// Copyright © 2017 Krunoslav Zaher. All rights reserved.
7+
//
8+
9+
import XCTest
10+
import RxSwift
11+
import RxCocoa
12+
13+
let iterations = 100000
14+
15+
class Benchmarks: XCTestCase {
16+
17+
override func setUp() {
18+
}
19+
20+
override func tearDown() {
21+
}
22+
23+
func testPublishSubjectPumping() {
24+
measure {
25+
var sum = 0
26+
let subject = PublishSubject<Int>()
27+
28+
let subscription = subject
29+
.subscribe(onNext: { x in
30+
sum += x
31+
})
32+
33+
for _ in 0 ..< iterations {
34+
subject.on(.next(1))
35+
}
36+
37+
subscription.dispose()
38+
39+
XCTAssertEqual(sum, iterations)
40+
}
41+
}
42+
43+
func testPublishSubjectCreating() {
44+
measure {
45+
var sum = 0
46+
47+
for _ in 0 ..< iterations {
48+
let subject = PublishSubject<Int>()
49+
50+
let subscription = subject
51+
.subscribe(onNext: { x in
52+
sum += x
53+
})
54+
55+
for _ in 0 ..< 1 {
56+
subject.on(.next(1))
57+
}
58+
59+
subscription.dispose()
60+
}
61+
62+
XCTAssertEqual(sum, iterations)
63+
}
64+
}
65+
66+
func testMapFilterPumping() {
67+
measure {
68+
var sum = 0
69+
let subscription = Observable<Int>.create { observer in
70+
for _ in 0 ..< iterations {
71+
observer.on(.next(1))
72+
}
73+
return Disposables.create()
74+
}
75+
.map { $0 }.filter { _ in true }
76+
.map { $0 }.filter { _ in true }
77+
.map { $0 }.filter { _ in true }
78+
.map { $0 }.filter { _ in true }
79+
.map { $0 }.filter { _ in true }
80+
.map { $0 }.filter { _ in true }
81+
.subscribe(onNext: { x in
82+
sum += x
83+
})
84+
85+
subscription.dispose()
86+
87+
XCTAssertEqual(sum, iterations)
88+
}
89+
}
90+
91+
func testMapFilterCreating() {
92+
measure {
93+
var sum = 0
94+
95+
for _ in 0 ..< iterations {
96+
let subscription = Observable<Int>.create { observer in
97+
for _ in 0 ..< 1 {
98+
observer.on(.next(1))
99+
}
100+
return Disposables.create()
101+
}
102+
.map { $0 }.filter { _ in true }
103+
.map { $0 }.filter { _ in true }
104+
.map { $0 }.filter { _ in true }
105+
.map { $0 }.filter { _ in true }
106+
.map { $0 }.filter { _ in true }
107+
.map { $0 }.filter { _ in true }
108+
.subscribe(onNext: { x in
109+
sum += x
110+
})
111+
112+
subscription.dispose()
113+
}
114+
115+
XCTAssertEqual(sum, iterations)
116+
}
117+
}
118+
119+
func testMapFilterDriverPumping() {
120+
measure {
121+
var sum = 0
122+
let subscription = Observable<Int>.create { observer in
123+
for _ in 0 ..< iterations {
124+
observer.on(.next(1))
125+
}
126+
return Disposables.create()
127+
}.asDriver(onErrorJustReturn: -1)
128+
.map { $0 }.filter { _ in true }
129+
.map { $0 }.filter { _ in true }
130+
.map { $0 }.filter { _ in true }
131+
.map { $0 }.filter { _ in true }
132+
.map { $0 }.filter { _ in true }
133+
.map { $0 }.filter { _ in true }
134+
.drive(onNext: { x in
135+
sum += x
136+
})
137+
138+
subscription.dispose()
139+
140+
XCTAssertEqual(sum, iterations)
141+
}
142+
}
143+
144+
func testMapFilterDriverCreating() {
145+
measure {
146+
var sum = 0
147+
148+
for _ in 0 ..< iterations {
149+
let subscription = Observable<Int>.create { observer in
150+
for _ in 0 ..< 1 {
151+
observer.on(.next(1))
152+
}
153+
return Disposables.create()
154+
}.asDriver(onErrorJustReturn: -1)
155+
.map { $0 }.filter { _ in true }
156+
.map { $0 }.filter { _ in true }
157+
.map { $0 }.filter { _ in true }
158+
.map { $0 }.filter { _ in true }
159+
.map { $0 }.filter { _ in true }
160+
.map { $0 }.filter { _ in true }
161+
.drive(onNext: { x in
162+
sum += x
163+
})
164+
165+
subscription.dispose()
166+
}
167+
168+
XCTAssertEqual(sum, iterations)
169+
}
170+
}
171+
172+
func testFlatMapsPumping() {
173+
measure {
174+
var sum = 0
175+
let subscription = Observable<Int>.create { observer in
176+
for _ in 0 ..< iterations {
177+
observer.on(.next(1))
178+
}
179+
return Disposables.create()
180+
}
181+
.flatMap { x in Observable.just(x) }
182+
.flatMap { x in Observable.just(x) }
183+
.flatMap { x in Observable.just(x) }
184+
.flatMap { x in Observable.just(x) }
185+
.flatMap { x in Observable.just(x) }
186+
.subscribe(onNext: { x in
187+
sum += x
188+
})
189+
190+
subscription.dispose()
191+
192+
XCTAssertEqual(sum, iterations)
193+
}
194+
}
195+
196+
func testFlatMapsCreating() {
197+
measure {
198+
var sum = 0
199+
for _ in 0 ..< 1 {
200+
let subscription = Observable<Int>.create { observer in
201+
for _ in 0 ..< iterations {
202+
observer.on(.next(1))
203+
}
204+
return Disposables.create()
205+
}
206+
.flatMap { x in Observable.just(x) }
207+
.flatMap { x in Observable.just(x) }
208+
.flatMap { x in Observable.just(x) }
209+
.flatMap { x in Observable.just(x) }
210+
.flatMap { x in Observable.just(x) }
211+
.subscribe(onNext: { x in
212+
sum += x
213+
})
214+
215+
subscription.dispose()
216+
}
217+
218+
XCTAssertEqual(sum, iterations)
219+
}
220+
}
221+
222+
func testFlatMapLatestPumping() {
223+
measure {
224+
var sum = 0
225+
let subscription = Observable<Int>.create { observer in
226+
for _ in 0 ..< iterations {
227+
observer.on(.next(1))
228+
}
229+
return Disposables.create()
230+
}
231+
.flatMapLatest { x in Observable.just(x) }
232+
.flatMapLatest { x in Observable.just(x) }
233+
.flatMapLatest { x in Observable.just(x) }
234+
.flatMapLatest { x in Observable.just(x) }
235+
.flatMapLatest { x in Observable.just(x) }
236+
.subscribe(onNext: { x in
237+
sum += x
238+
})
239+
240+
subscription.dispose()
241+
242+
XCTAssertEqual(sum, iterations)
243+
}
244+
}
245+
246+
func testFlatMapLatestCreating() {
247+
measure {
248+
var sum = 0
249+
for _ in 0 ..< 1 {
250+
let subscription = Observable<Int>.create { observer in
251+
for _ in 0 ..< iterations {
252+
observer.on(.next(1))
253+
}
254+
return Disposables.create()
255+
}
256+
.flatMapLatest { x in Observable.just(x) }
257+
.flatMapLatest { x in Observable.just(x) }
258+
.flatMapLatest { x in Observable.just(x) }
259+
.flatMapLatest { x in Observable.just(x) }
260+
.flatMapLatest { x in Observable.just(x) }
261+
.subscribe(onNext: { x in
262+
sum += x
263+
})
264+
265+
subscription.dispose()
266+
}
267+
268+
XCTAssertEqual(sum, iterations)
269+
}
270+
}
271+
272+
func testCombineLatestPumping() {
273+
measure {
274+
var sum = 0
275+
var last = Observable.combineLatest(
276+
Observable.just(1), Observable.just(1), Observable.just(1),
277+
Observable<Int>.create { observer in
278+
for _ in 0 ..< iterations {
279+
observer.on(.next(1))
280+
}
281+
return Disposables.create()
282+
}) { x, _, _ ,_ in x }
283+
284+
for _ in 0 ..< 6 {
285+
last = Observable.combineLatest(Observable.just(1), Observable.just(1), Observable.just(1), last) { x, _, _ ,_ in x }
286+
}
287+
288+
let subscription = last
289+
.subscribe(onNext: { x in
290+
sum += x
291+
})
292+
293+
subscription.dispose()
294+
295+
XCTAssertEqual(sum, iterations)
296+
}
297+
}
298+
299+
func testCombineLatestCreating() {
300+
measure {
301+
var sum = 0
302+
for _ in 0 ..< iterations {
303+
var last = Observable.combineLatest(
304+
Observable<Int>.create { observer in
305+
for _ in 0 ..< 1 {
306+
observer.on(.next(1))
307+
}
308+
return Disposables.create()
309+
}, Observable.just(1), Observable.just(1), Observable.just(1)) { x, _, _ ,_ in x }
310+
311+
for _ in 0 ..< 6 {
312+
last = Observable.combineLatest(last, Observable.just(1), Observable.just(1), Observable.just(1)) { x, _, _ ,_ in x }
313+
}
314+
315+
let subscription = last
316+
.subscribe(onNext: { x in
317+
sum += x
318+
})
319+
320+
subscription.dispose()
321+
}
322+
323+
XCTAssertEqual(sum, iterations)
324+
}
325+
}
326+
}

Tests/Benchmarks/Info.plist

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>CFBundleDevelopmentRegion</key>
6+
<string>en</string>
7+
<key>CFBundleExecutable</key>
8+
<string>$(EXECUTABLE_NAME)</string>
9+
<key>CFBundleIdentifier</key>
10+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11+
<key>CFBundleInfoDictionaryVersion</key>
12+
<string>6.0</string>
13+
<key>CFBundleName</key>
14+
<string>$(PRODUCT_NAME)</string>
15+
<key>CFBundlePackageType</key>
16+
<string>BNDL</string>
17+
<key>CFBundleShortVersionString</key>
18+
<string>1.0</string>
19+
<key>CFBundleVersion</key>
20+
<string>1</string>
21+
</dict>
22+
</plist>

Tests/Microoptimizations/main.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// main.swift
3+
// Tests
4+
//
5+
// Created by Krunoslav Zaher on 9/26/15.
6+
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import RxSwift
11+
#if !SWIFT_PACKAGE
12+
import RxCocoa
13+
#endif
14+
import AppKit
15+
import CoreLocation
16+
17+
let bechmarkTime = true
18+
19+
func allocation() {
20+
21+
}
22+
23+
repeat {
24+
compareTwoImplementations(benchmarkTime: true, benchmarkMemory: false, first: {
25+
let lock = NSRecursiveLock()
26+
for i in 0 ..< 1000 {
27+
lock.lock()
28+
lock.unlock()
29+
}
30+
}, second: {
31+
let lock = NSRecursiveLock2()
32+
for i in 0 ..< 1000 {
33+
lock.lock()
34+
lock.unlock()
35+
}
36+
})
37+
} while true

0 commit comments

Comments
 (0)