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

Commit 3b67e8d

Browse files
committed
Add performance tests
1 parent 00ea239 commit 3b67e8d

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

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 */,
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
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 semaphore = DispatchSemaphore(value: 0)
14+
15+
measure {
16+
for _ in 0 ..< iterationCount {
17+
queue.async {
18+
semaphore.signal()
19+
}
20+
semaphore.wait()
21+
}
22+
}
23+
}
24+
25+
func testDoubleDispatchAsyncOnSerialQueue() {
26+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
27+
let semaphore = DispatchSemaphore(value: 0)
28+
29+
measure {
30+
for _ in 0 ..< iterationCount {
31+
queue.async {
32+
queue.async {
33+
semaphore.signal()
34+
}
35+
}
36+
semaphore.wait()
37+
}
38+
}
39+
}
40+
41+
func testTripleDispatchAsyncOnSerialQueue() {
42+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
43+
let semaphore = DispatchSemaphore(value: 0)
44+
45+
measure {
46+
for _ in 0 ..< iterationCount {
47+
queue.async {
48+
queue.async {
49+
queue.async {
50+
semaphore.signal()
51+
}
52+
}
53+
}
54+
semaphore.wait()
55+
}
56+
}
57+
}
58+
59+
func testDispatchAsyncOnConcurrentQueue() {
60+
let queue = DispatchQueue(label: #function, qos: .userInitiated, attributes: .concurrent)
61+
let group = DispatchGroup()
62+
func noop() {}
63+
64+
measure {
65+
for _ in 0 ..< iterationCount {
66+
queue.async(group: group, execute: noop)
67+
}
68+
69+
XCTAssertEqual(group.wait(timeout: .now() + 1), .success)
70+
}
71+
}
72+
73+
// MARK: - Deferred
74+
75+
func testUponToSerialQueue() {
76+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
77+
let semaphore = DispatchSemaphore(value: 0)
78+
79+
measure {
80+
for _ in 0 ..< iterationCount {
81+
Deferred(filledWith: true).upon(queue) { _ in
82+
semaphore.signal()
83+
}
84+
85+
semaphore.wait()
86+
}
87+
}
88+
}
89+
90+
func testDoubleUponToSerialQueue() {
91+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
92+
let semaphore = DispatchSemaphore(value: 0)
93+
94+
measure {
95+
for _ in 0 ..< iterationCount {
96+
Deferred(filledWith: true).map(upon: .any()) { $0 }.upon(queue) { _ in
97+
semaphore.signal()
98+
}
99+
100+
semaphore.wait()
101+
}
102+
}
103+
}
104+
105+
func testTripleUponSerialQueue() {
106+
let queue = DispatchQueue(label: #function, qos: .userInitiated)
107+
let semaphore = DispatchSemaphore(value: 0)
108+
109+
measure {
110+
for _ in 0 ..< iterationCount {
111+
Deferred(filledWith: true).map(upon: .any()) { $0 }.map(upon: .any()) { $0 }.upon(queue) { _ in
112+
semaphore.signal()
113+
}
114+
115+
semaphore.wait()
116+
}
117+
}
118+
}
119+
120+
func testFillWithUponToConcurrentQueue() {
121+
let queue = DispatchQueue(label: #function, qos: .userInitiated, attributes: .concurrent)
122+
let group = DispatchGroup()
123+
var deferreds = [Deferred<Bool>]()
124+
125+
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
126+
let metrics = PerformanceTests.defaultPerformanceMetrics
127+
#else
128+
let metrics = PerformanceTests.defaultPerformanceMetrics()
129+
#endif
130+
131+
measureMetrics(metrics, automaticallyStartMeasuring: false) {
132+
deferreds.removeAll(keepingCapacity: true)
133+
134+
for _ in 0 ..< iterationCount {
135+
let deferred = Deferred<Bool>()
136+
group.enter()
137+
deferred.upon(queue) { _ in
138+
group.leave()
139+
}
140+
deferreds.append(deferred)
141+
}
142+
143+
startMeasuring()
144+
for deferred in deferreds {
145+
deferred.fill(with: true)
146+
}
147+
148+
XCTAssertEqual(group.wait(timeout: .now() + 1), .success)
149+
stopMeasuring()
150+
}
151+
}
152+
153+
}

0 commit comments

Comments
 (0)