14
14
// rdar://problem/19804127
15
15
import TestsUtils
16
16
17
+ let size = 100
18
+ let numberMap = Dictionary ( uniqueKeysWithValues: zip ( 1 ... size, 1 ... size) )
19
+ let boxedNums = ( 1 ... size) . lazy. map { Box ( $0) }
20
+ let boxedNumMap = Dictionary ( uniqueKeysWithValues: zip ( boxedNums, boxedNums) )
21
+
17
22
let t : [ BenchmarkCategory ] = [ . validation, . api, . Dictionary]
18
23
19
24
public let DictionarySwap = [
20
25
BenchmarkInfo ( name: " DictionarySwap " ,
21
- runFunction: run_DictionarySwap , tags: t, legacyFactor: 4 ) ,
26
+ runFunction: swap , tags: t, legacyFactor: 4 ) ,
22
27
BenchmarkInfo ( name: " DictionarySwapOfObjects " ,
23
- runFunction: run_DictionarySwapOfObjects , tags: t, legacyFactor: 40 ) ,
28
+ runFunction: swapObjects , tags: t, legacyFactor: 40 ) ,
24
29
BenchmarkInfo ( name: " DictionarySwapAt " ,
25
- runFunction: run_DictionarySwapAt , tags: t, legacyFactor: 4 ) ,
30
+ runFunction: swapAt , tags: t, legacyFactor: 4 ) ,
26
31
BenchmarkInfo ( name: " DictionarySwapAtOfObjects " ,
27
- runFunction: run_DictionarySwapAtOfObjects , tags: t, legacyFactor: 40 ) ,
32
+ runFunction: swapAtObjects , tags: t, legacyFactor: 11 ) ,
28
33
]
29
34
30
- @inline ( never)
31
- public func run_DictionarySwap( _ N: Int ) {
32
- let size = 100
33
- var dict = [ Int: Int] ( minimumCapacity: size)
34
-
35
- // Fill dictionary
36
- for i in 1 ... size {
37
- dict [ i] = i
38
- }
39
- CheckResults ( dict. count == size)
40
-
41
- var swapped = false
42
- for _ in 1 ... 2500 * N {
43
- ( dict [ 25 ] , dict [ 75 ] ) = ( dict [ 75 ] !, dict [ 25 ] !)
44
- swapped = !swapped
45
- if !swappedCorrectly( swapped, dict [ 25 ] !, dict [ 75 ] !) {
46
- break
47
- }
48
- }
49
-
50
- CheckResults ( swappedCorrectly ( swapped, dict [ 25 ] !, dict [ 75 ] !) )
51
- }
52
-
53
- @inline ( never)
54
- public func run_DictionarySwapAt( _ N: Int ) {
55
- let size = 100
56
- var dict = [ Int: Int] ( minimumCapacity: size)
57
-
58
- // Fill dictionary
59
- for i in 1 ... size {
60
- dict [ i] = i
61
- }
62
- CheckResults ( dict. count == size)
63
-
64
- var swapped = false
65
- for _ in 1 ... 2500 * N {
66
- let i25 = dict. index ( forKey: 25 ) !
67
- let i75 = dict. index ( forKey: 75 ) !
68
-
69
- dict. values. swapAt ( i25, i75)
70
- swapped = !swapped
71
- if !swappedCorrectly( swapped, dict [ 25 ] !, dict [ 75 ] !) {
72
- break
73
- }
74
- }
75
-
76
- CheckResults ( swappedCorrectly ( swapped, dict [ 25 ] !, dict [ 75 ] !) )
77
- }
78
-
79
35
// Return true if correctly swapped, false otherwise
80
36
func swappedCorrectly( _ swapped: Bool , _ p25: Int , _ p75: Int ) -> Bool {
81
37
return swapped && ( p25 == 75 && p75 == 25 ) ||
@@ -98,55 +54,49 @@ class Box<T : Hashable> : Hashable {
98
54
}
99
55
}
100
56
101
- @inline ( never)
102
- public func run_DictionarySwapOfObjects( _ N: Int ) {
103
- let size = 100
104
- var dict = Dictionary < Box < Int > , Box < Int > > ( minimumCapacity: size)
105
-
106
- // Fill dictionary
107
- for i in 1 ... size {
108
- dict [ Box ( i) ] = Box ( i)
109
- }
110
- CheckResults ( dict. count == size)
111
-
112
- var swapped = false
113
- for _ in 1 ... 250 * N {
114
- let b1 = Box ( 25 )
115
- let b2 = Box ( 75 )
116
- ( dict [ b1] , dict [ b2] ) = ( dict [ b2] !, dict [ b1] !)
117
- swapped = !swapped
118
- if !swappedCorrectly( swapped, dict [ Box ( 25 ) ] !. value, dict [ Box ( 75 ) ] !. value) {
119
- break
120
- }
57
+ func swap( N: Int ) {
58
+ var dict = numberMap
59
+ var swapped = false
60
+ for _ in 1 ... 2500 * N {
61
+ ( dict [ 25 ] , dict [ 75 ] ) = ( dict [ 75 ] !, dict [ 25 ] !)
62
+ swapped = !swapped
63
+ CheckResults ( swappedCorrectly ( swapped, dict [ 25 ] !, dict [ 75 ] !) )
121
64
}
122
-
123
- CheckResults ( swappedCorrectly ( swapped, dict [ Box ( 25 ) ] !. value, dict [ Box ( 75 ) ] !. value) )
124
65
}
125
66
126
- @inline ( never)
127
- public func run_DictionarySwapAtOfObjects( _ N: Int ) {
128
- let size = 100
129
- var dict = [ Box < Int > : Box < Int > ] ( minimumCapacity: size)
130
-
131
- // Fill dictionary
132
- for i in 1 ... size {
133
- dict [ Box ( i) ] = Box ( i)
134
- }
135
- CheckResults ( dict. count == size)
136
-
67
+ func swapObjects( N: Int ) {
68
+ var dict = boxedNumMap
137
69
var swapped = false
138
70
for _ in 1 ... 250 * N {
139
- let b25 = Box ( 25 )
140
- let b75 = Box ( 75 )
141
- let i25 = dict. index ( forKey: b25) !
142
- let i75 = dict. index ( forKey: b75) !
71
+ let b1 = Box ( 25 )
72
+ let b2 = Box ( 75 )
73
+ ( dict [ b1] , dict [ b2] ) = ( dict [ b2] !, dict [ b1] !)
74
+ swapped = !swapped
75
+ CheckResults ( swappedCorrectly ( swapped,
76
+ dict [ Box ( 25 ) ] !. value, dict [ Box ( 75 ) ] !. value) )
77
+ }
78
+ }
143
79
80
+ func swapAt( N: Int ) {
81
+ var dict = numberMap
82
+ var swapped = false
83
+ for _ in 1 ... 2500 * N {
84
+ let i25 = dict. index ( forKey: 25 ) !
85
+ let i75 = dict. index ( forKey: 75 ) !
144
86
dict. values. swapAt ( i25, i75)
145
87
swapped = !swapped
146
- if !swappedCorrectly( swapped, dict [ Box ( 25 ) ] !. value, dict [ Box ( 75 ) ] !. value) {
147
- break
148
- }
88
+ CheckResults ( swappedCorrectly ( swapped, dict [ 25 ] !, dict [ 75 ] !) )
149
89
}
150
-
151
- CheckResults ( swappedCorrectly ( swapped, dict [ Box ( 25 ) ] !. value, dict [ Box ( 75 ) ] !. value) )
152
90
}
91
+
92
+ func swapAtObjects( N: Int ) {
93
+ var dict = boxedNumMap
94
+ var swapped = false
95
+ for _ in 1 ... 1000 * N {
96
+ let i25 = dict. index ( forKey: Box ( 25 ) ) !
97
+ let i75 = dict. index ( forKey: Box ( 75 ) ) !
98
+ dict. values. swapAt ( i25, i75)
99
+ swapped = !swapped
100
+ CheckResults ( swappedCorrectly ( swapped,
101
+ dict [ Box ( 25 ) ] !. value, dict [ Box ( 75 ) ] !. value) )
102
+ } }
0 commit comments