Skip to content
This repository was archived by the owner on Aug 29, 2022. It is now read-only.

Commit 954b77b

Browse files
committed
Merge pull request #213 from bignerdranch/zwaldowski/perf-tests
Add performance tests
2 parents 9a26862 + 15b6891 commit 954b77b

File tree

4 files changed

+192
-12
lines changed

4 files changed

+192
-12
lines changed

.fastlane/README.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,6 @@ or alternatively using `brew cask install fastlane`
2020
fastlane bump_version
2121
```
2222
Increment (with 'bump' option) or set (with 'pre' option) the framework version
23-
### pod_lint
24-
```
25-
fastlane pod_lint
26-
```
27-
Run CocoaPods linter
2823
### build_docs
2924
```
3025
fastlane build_docs

Deferred.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@
166166
DB126D951E5369E200054E95 /* Deferred.h in Headers */ = {isa = PBXBuildFile; fileRef = DB524CA11D85200C00DDF16D /* Deferred.h */; settings = {ATTRIBUTES = (Public, ); }; };
167167
DB126D961E5369E300054E95 /* Deferred.h in Headers */ = {isa = PBXBuildFile; fileRef = DB524CA11D85200C00DDF16D /* Deferred.h */; settings = {ATTRIBUTES = (Public, ); }; };
168168
DB126D971E5369E300054E95 /* Deferred.h in Headers */ = {isa = PBXBuildFile; fileRef = DB524CA11D85200C00DDF16D /* Deferred.h */; settings = {ATTRIBUTES = (Public, ); }; };
169+
DB8A071C2060D38C00639AB3 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8A071B2060D38C00639AB3 /* PerformanceTests.swift */; };
170+
DB8A071D2060D38C00639AB3 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8A071B2060D38C00639AB3 /* PerformanceTests.swift */; };
171+
DB8A071E2060D38C00639AB3 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8A071B2060D38C00639AB3 /* PerformanceTests.swift */; };
169172
/* End PBXBuildFile section */
170173

171174
/* Begin PBXContainerItemProxy section */
@@ -249,6 +252,7 @@
249252
DB55F1FC1D96968E00FC1439 /* TaskTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TaskTests.swift; sourceTree = "<group>"; };
250253
DB55F1FD1D96968E00FC1439 /* TaskWorkItemTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TaskWorkItemTests.swift; sourceTree = "<group>"; };
251254
DB55F20B1D969A1B00FC1439 /* FutureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FutureTests.swift; sourceTree = "<group>"; };
255+
DB8A071B2060D38C00639AB3 /* PerformanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PerformanceTests.swift; sourceTree = "<group>"; };
252256
DBC742631DC2F6D4002FB30D /* FutureEveryMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FutureEveryMap.swift; sourceTree = "<group>"; };
253257
EBEB828C1DC4A79A00B7E089 /* TaskComprehensiveTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TaskComprehensiveTests.swift; sourceTree = "<group>"; };
254258
/* End PBXFileReference section */
@@ -425,6 +429,7 @@
425429
DB55F1F31D96968E00FC1439 /* FutureIgnoreTests.swift */,
426430
DB55F20B1D969A1B00FC1439 /* FutureTests.swift */,
427431
DB55F1F41D96968E00FC1439 /* LockingTests.swift */,
432+
DB8A071B2060D38C00639AB3 /* PerformanceTests.swift */,
428433
DB55F1F51D96968E00FC1439 /* ProtectedTests.swift */,
429434
DB4002691DDC21B300382BAE /* SwiftBugTests.swift */,
430435
);
@@ -774,6 +779,7 @@
774779
files = (
775780
DB126D671E5368B900054E95 /* SwiftBugTests.swift in Sources */,
776781
DB126D601E5368B900054E95 /* DeferredTests.swift in Sources */,
782+
DB8A071C2060D38C00639AB3 /* PerformanceTests.swift in Sources */,
777783
DB126D651E5368B900054E95 /* LockingTests.swift in Sources */,
778784
DB126D691E5368B900054E95 /* TaskResultTests.swift in Sources */,
779785
DB126D6A1E5368B900054E95 /* VoidResultTests.swift in Sources */,
@@ -829,6 +835,7 @@
829835
files = (
830836
DB126D771E5368B900054E95 /* SwiftBugTests.swift in Sources */,
831837
DB126D701E5368B900054E95 /* DeferredTests.swift in Sources */,
838+
DB8A071D2060D38C00639AB3 /* PerformanceTests.swift in Sources */,
832839
DB126D751E5368B900054E95 /* LockingTests.swift in Sources */,
833840
DB126D791E5368B900054E95 /* TaskResultTests.swift in Sources */,
834841
DB126D7A1E5368B900054E95 /* VoidResultTests.swift in Sources */,
@@ -884,6 +891,7 @@
884891
files = (
885892
DB126D871E5368BA00054E95 /* SwiftBugTests.swift in Sources */,
886893
DB126D801E5368BA00054E95 /* DeferredTests.swift in Sources */,
894+
DB8A071E2060D38C00639AB3 /* PerformanceTests.swift in Sources */,
887895
DB126D851E5368BA00054E95 /* LockingTests.swift in Sources */,
888896
DB126D891E5368BA00054E95 /* TaskResultTests.swift in Sources */,
889897
DB126D8A1E5368BA00054E95 /* VoidResultTests.swift in Sources */,

Gemfile.lock

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
GEM
22
remote: https://rubygems.org/
33
specs:
4-
CFPropertyList (2.3.6)
4+
CFPropertyList (3.0.0)
55
activesupport (4.2.10)
66
i18n (~> 0.7)
77
minitest (~> 5.1)
@@ -65,7 +65,7 @@ GEM
6565
faraday_middleware (0.12.2)
6666
faraday (>= 0.7.4, < 1.0)
6767
fastimage (2.1.1)
68-
fastlane (2.86.0)
68+
fastlane (2.87.0)
6969
CFPropertyList (>= 2.3, < 4.0.0)
7070
addressable (>= 2.3, < 3.0.0)
7171
babosa (>= 1.0.2, < 2.0.0)
@@ -97,7 +97,7 @@ GEM
9797
tty-screen (>= 0.6.3, < 1.0.0)
9898
tty-spinner (>= 0.8.0, < 1.0.0)
9999
word_wrap (~> 1.0.0)
100-
xcodeproj (>= 1.5.2, < 2.0.0)
100+
xcodeproj (>= 1.5.7, < 2.0.0)
101101
xcpretty (>= 0.2.4, < 1.0.0)
102102
xcpretty-travis-formatter (>= 0.0.3)
103103
ffi (1.9.23)
@@ -152,7 +152,7 @@ GEM
152152
multi_xml (0.6.0)
153153
multipart-post (2.0.0)
154154
mustache (0.99.8)
155-
nanaimo (0.2.3)
155+
nanaimo (0.2.4)
156156
nap (1.1.0)
157157
naturally (2.1.0)
158158
netrc (0.11.0)
@@ -207,12 +207,12 @@ GEM
207207
word_wrap (1.0.0)
208208
xcinvoke (0.3.0)
209209
liferaft (~> 0.0.6)
210-
xcodeproj (1.5.6)
211-
CFPropertyList (~> 2.3.3)
210+
xcodeproj (1.5.7)
211+
CFPropertyList (>= 2.3.3, < 4.0)
212212
atomos (~> 0.1.2)
213213
claide (>= 1.0.2, < 2.0)
214214
colored2 (~> 3.1)
215-
nanaimo (~> 0.2.3)
215+
nanaimo (~> 0.2.4)
216216
xcpretty (0.2.8)
217217
rouge (~> 2.0.7)
218218
xcpretty-travis-formatter (1.0.0)
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
import XCTest
2+
import Dispatch
3+
import Deferred
4+
5+
class PerformanceTests: XCTestCase {
6+
7+
private let iterationCount = 10_000
8+
9+
// MARK: - GCD
10+
11+
func testDispatchAsyncOnSerialQueue() {
12+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
13+
let group = DispatchGroup()
14+
15+
measure {
16+
for _ in 0 ..< iterationCount {
17+
group.enter()
18+
queue.async {
19+
group.leave()
20+
}
21+
}
22+
23+
group.wait()
24+
}
25+
}
26+
27+
func testDoubleDispatchAsyncOnSerialQueue() {
28+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
29+
let group = DispatchGroup()
30+
31+
measure {
32+
for _ in 0 ..< iterationCount {
33+
group.enter()
34+
queue.async {
35+
queue.async {
36+
group.leave()
37+
}
38+
}
39+
}
40+
41+
group.wait()
42+
}
43+
}
44+
45+
func testTripleDispatchAsyncOnSerialQueue() {
46+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
47+
let group = DispatchGroup()
48+
49+
measure {
50+
for _ in 0 ..< iterationCount {
51+
group.enter()
52+
queue.async {
53+
queue.async {
54+
queue.async {
55+
group.leave()
56+
}
57+
}
58+
}
59+
}
60+
61+
group.wait()
62+
}
63+
}
64+
65+
func testDispatchAsyncOnConcurrentQueue() {
66+
let queue = DispatchQueue(label: #function, qos: .userInitiated, attributes: .concurrent)
67+
let group = DispatchGroup()
68+
func noop() {}
69+
70+
measure {
71+
for _ in 0 ..< iterationCount {
72+
queue.async(group: group, execute: noop)
73+
}
74+
75+
XCTAssertEqual(group.wait(timeout: .now() + 1), .success)
76+
}
77+
}
78+
79+
// MARK: - Deferred
80+
81+
func testUponToSerialQueue() {
82+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
83+
let group = DispatchGroup()
84+
85+
measure {
86+
let deferred = Deferred<Bool>()
87+
88+
for _ in 0 ..< iterationCount {
89+
group.enter()
90+
deferred.upon(queue) { _ in
91+
group.leave()
92+
}
93+
}
94+
95+
deferred.fill(with: true)
96+
group.wait()
97+
}
98+
}
99+
100+
func testDoubleUponToSerialQueue() {
101+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
102+
let group = DispatchGroup()
103+
104+
measure {
105+
let deferred = Deferred<Bool>()
106+
107+
for _ in 0 ..< iterationCount {
108+
group.enter()
109+
deferred.upon(queue) { _ in
110+
deferred.upon(queue) { _ in
111+
group.leave()
112+
}
113+
}
114+
}
115+
116+
deferred.fill(with: true)
117+
group.wait()
118+
}
119+
}
120+
121+
func testTripleUponSerialQueue() {
122+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
123+
let group = DispatchGroup()
124+
125+
measure {
126+
let deferred = Deferred<Bool>()
127+
128+
for _ in 0 ..< iterationCount {
129+
group.enter()
130+
deferred.upon(queue) { _ in
131+
deferred.upon(queue) { _ in
132+
deferred.upon(queue) { _ in
133+
group.leave()
134+
}
135+
}
136+
}
137+
}
138+
139+
deferred.fill(with: true)
140+
group.wait()
141+
}
142+
}
143+
144+
func testFillWithUponToConcurrentQueue() {
145+
let queue = DispatchQueue(label: #function, qos: .userInitiated, attributes: .concurrent)
146+
let group = DispatchGroup()
147+
var deferreds = [Deferred<Bool>]()
148+
149+
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) || swift(>=4.1)
150+
let metrics = PerformanceTests.defaultPerformanceMetrics
151+
#else
152+
let metrics = PerformanceTests.defaultPerformanceMetrics()
153+
#endif
154+
155+
measureMetrics(metrics, automaticallyStartMeasuring: false) {
156+
deferreds.removeAll(keepingCapacity: true)
157+
158+
for _ in 0 ..< iterationCount {
159+
let deferred = Deferred<Bool>()
160+
group.enter()
161+
deferred.upon(queue) { _ in
162+
group.leave()
163+
}
164+
deferreds.append(deferred)
165+
}
166+
167+
startMeasuring()
168+
for deferred in deferreds {
169+
deferred.fill(with: true)
170+
}
171+
172+
XCTAssertEqual(group.wait(timeout: .now() + 1), .success)
173+
stopMeasuring()
174+
}
175+
}
176+
177+
}

0 commit comments

Comments
 (0)