@@ -75,53 +75,89 @@ public let ExistentialPerformance: [BenchmarkInfo] = [
75
75
BenchmarkInfo ( name: " Existential.MutatingAndNonMutating.Val2 " , runFunction: run_MutatingAndNonMutatingVal2, tags: t) ,
76
76
BenchmarkInfo ( name: " Existential.MutatingAndNonMutating.Val3 " , runFunction: run_MutatingAndNonMutatingVal3, tags: t) ,
77
77
BenchmarkInfo ( name: " Existential.MutatingAndNonMutating.Val4 " , runFunction: run_MutatingAndNonMutatingVal4, tags: t) ,
78
- BenchmarkInfo ( name: " Existential.Array.method.1x.Ref1 " , runFunction: run_Array_method1xRef1, tags: ta) ,
79
- BenchmarkInfo ( name: " Existential.Array.method.1x.Ref2 " , runFunction: run_Array_method1xRef2, tags: ta) ,
80
- BenchmarkInfo ( name: " Existential.Array.method.1x.Ref3 " , runFunction: run_Array_method1xRef3, tags: ta) ,
81
- BenchmarkInfo ( name: " Existential.Array.method.1x.Ref4 " , runFunction: run_Array_method1xRef4, tags: ta) ,
82
- BenchmarkInfo ( name: " Existential.Array.method.1x.Val0 " , runFunction: run_Array_method1xVal0, tags: ta) ,
83
- BenchmarkInfo ( name: " Existential.Array.method.1x.Val1 " , runFunction: run_Array_method1xVal1, tags: ta) ,
84
- BenchmarkInfo ( name: " Existential.Array.method.1x.Val2 " , runFunction: run_Array_method1xVal2, tags: ta) ,
85
- BenchmarkInfo ( name: " Existential.Array.method.1x.Val3 " , runFunction: run_Array_method1xVal3, tags: ta) ,
86
- BenchmarkInfo ( name: " Existential.Array.method.1x.Val4 " , runFunction: run_Array_method1xVal4, tags: ta) ,
87
- BenchmarkInfo ( name: " Existential.Array.method.2x.Ref1 " , runFunction: run_Array_method2xRef1, tags: ta) ,
88
- BenchmarkInfo ( name: " Existential.Array.method.2x.Ref2 " , runFunction: run_Array_method2xRef2, tags: ta) ,
89
- BenchmarkInfo ( name: " Existential.Array.method.2x.Ref3 " , runFunction: run_Array_method2xRef3, tags: ta) ,
90
- BenchmarkInfo ( name: " Existential.Array.method.2x.Ref4 " , runFunction: run_Array_method2xRef4, tags: ta) ,
91
- BenchmarkInfo ( name: " Existential.Array.method.2x.Val0 " , runFunction: run_Array_method2xVal0, tags: ta) ,
92
- BenchmarkInfo ( name: " Existential.Array.method.2x.Val1 " , runFunction: run_Array_method2xVal1, tags: ta) ,
93
- BenchmarkInfo ( name: " Existential.Array.method.2x.Val2 " , runFunction: run_Array_method2xVal2, tags: ta) ,
94
- BenchmarkInfo ( name: " Existential.Array.method.2x.Val3 " , runFunction: run_Array_method2xVal3, tags: ta) ,
95
- BenchmarkInfo ( name: " Existential.Array.method.2x.Val4 " , runFunction: run_Array_method2xVal4, tags: ta) ,
96
- BenchmarkInfo ( name: " Existential.Array.Mutating.Ref1 " , runFunction: run_ArrayMutatingRef1, tags: ta) ,
97
- BenchmarkInfo ( name: " Existential.Array.Mutating.Ref2 " , runFunction: run_ArrayMutatingRef2, tags: ta) ,
98
- BenchmarkInfo ( name: " Existential.Array.Mutating.Ref3 " , runFunction: run_ArrayMutatingRef3, tags: ta) ,
99
- BenchmarkInfo ( name: " Existential.Array.Mutating.Ref4 " , runFunction: run_ArrayMutatingRef4, tags: ta) ,
100
- BenchmarkInfo ( name: " Existential.Array.Mutating.Val0 " , runFunction: run_ArrayMutatingVal0, tags: ta) ,
101
- BenchmarkInfo ( name: " Existential.Array.Mutating.Val1 " , runFunction: run_ArrayMutatingVal1, tags: ta) ,
102
- BenchmarkInfo ( name: " Existential.Array.Mutating.Val2 " , runFunction: run_ArrayMutatingVal2, tags: ta) ,
103
- BenchmarkInfo ( name: " Existential.Array.Mutating.Val3 " , runFunction: run_ArrayMutatingVal3, tags: ta) ,
104
- BenchmarkInfo ( name: " Existential.Array.Mutating.Val4 " , runFunction: run_ArrayMutatingVal4, tags: ta) ,
105
- BenchmarkInfo ( name: " Existential.Array.Shift.Ref1 " , runFunction: run_ArrayShiftRef1, tags: ta) ,
106
- BenchmarkInfo ( name: " Existential.Array.Shift.Ref2 " , runFunction: run_ArrayShiftRef2, tags: ta) ,
107
- BenchmarkInfo ( name: " Existential.Array.Shift.Ref3 " , runFunction: run_ArrayShiftRef3, tags: ta) ,
108
- BenchmarkInfo ( name: " Existential.Array.Shift.Ref4 " , runFunction: run_ArrayShiftRef4, tags: ta) ,
109
- BenchmarkInfo ( name: " Existential.Array.Shift.Val0 " , runFunction: run_ArrayShiftVal0, tags: ta) ,
110
- BenchmarkInfo ( name: " Existential.Array.Shift.Val1 " , runFunction: run_ArrayShiftVal1, tags: ta) ,
111
- BenchmarkInfo ( name: " Existential.Array.Shift.Val2 " , runFunction: run_ArrayShiftVal2, tags: ta) ,
112
- BenchmarkInfo ( name: " Existential.Array.Shift.Val3 " , runFunction: run_ArrayShiftVal3, tags: ta) ,
113
- BenchmarkInfo ( name: " Existential.Array.Shift.Val4 " , runFunction: run_ArrayShiftVal4, tags: ta) ,
114
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref1 " , runFunction: run_ArrayConditionalShiftRef1, tags: ta) ,
115
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref2 " , runFunction: run_ArrayConditionalShiftRef2, tags: ta) ,
116
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref3 " , runFunction: run_ArrayConditionalShiftRef3, tags: ta) ,
117
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref4 " , runFunction: run_ArrayConditionalShiftRef4, tags: ta) ,
118
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val0 " , runFunction: run_ArrayConditionalShiftVal0, tags: ta) ,
119
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val1 " , runFunction: run_ArrayConditionalShiftVal1, tags: ta) ,
120
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val2 " , runFunction: run_ArrayConditionalShiftVal2, tags: ta) ,
121
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val3 " , runFunction: run_ArrayConditionalShiftVal3, tags: ta) ,
122
- BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val4 " , runFunction: run_ArrayConditionalShiftVal4, tags: ta) ,
78
+ BenchmarkInfo ( name: " Existential.Array.init.Ref1 " , runFunction: run_Array_initRef1, tags: ta, setUpFunction: caRef1) ,
79
+ BenchmarkInfo ( name: " Existential.Array.init.Ref2 " , runFunction: run_Array_initRef2, tags: ta, setUpFunction: caRef2) ,
80
+ BenchmarkInfo ( name: " Existential.Array.init.Ref3 " , runFunction: run_Array_initRef3, tags: ta, setUpFunction: caRef3) ,
81
+ BenchmarkInfo ( name: " Existential.Array.init.Ref4 " , runFunction: run_Array_initRef4, tags: ta, setUpFunction: caRef4) ,
82
+ BenchmarkInfo ( name: " Existential.Array.init.Val0 " , runFunction: run_Array_initVal0, tags: ta, setUpFunction: caVal0) ,
83
+ BenchmarkInfo ( name: " Existential.Array.init.Val1 " , runFunction: run_Array_initVal1, tags: ta, setUpFunction: caVal1) ,
84
+ BenchmarkInfo ( name: " Existential.Array.init.Val2 " , runFunction: run_Array_initVal2, tags: ta, setUpFunction: caVal2) ,
85
+ BenchmarkInfo ( name: " Existential.Array.init.Val3 " , runFunction: run_Array_initVal3, tags: ta, setUpFunction: caVal3) ,
86
+ BenchmarkInfo ( name: " Existential.Array.init.Val4 " , runFunction: run_Array_initVal4, tags: ta, setUpFunction: caVal4) ,
87
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Ref1 " , runFunction: run_Array_method1xRef1, tags: ta, setUpFunction: caRef1) ,
88
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Ref2 " , runFunction: run_Array_method1xRef2, tags: ta, setUpFunction: caRef2) ,
89
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Ref3 " , runFunction: run_Array_method1xRef3, tags: ta, setUpFunction: caRef3) ,
90
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Ref4 " , runFunction: run_Array_method1xRef4, tags: ta, setUpFunction: caRef4) ,
91
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Val0 " , runFunction: run_Array_method1xVal0, tags: ta, setUpFunction: caVal0) ,
92
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Val1 " , runFunction: run_Array_method1xVal1, tags: ta, setUpFunction: caVal1) ,
93
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Val2 " , runFunction: run_Array_method1xVal2, tags: ta, setUpFunction: caVal2) ,
94
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Val3 " , runFunction: run_Array_method1xVal3, tags: ta, setUpFunction: caVal3) ,
95
+ BenchmarkInfo ( name: " Existential.Array.method.1x.Val4 " , runFunction: run_Array_method1xVal4, tags: ta, setUpFunction: caVal4) ,
96
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Ref1 " , runFunction: run_Array_method2xRef1, tags: ta, setUpFunction: caRef1) ,
97
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Ref2 " , runFunction: run_Array_method2xRef2, tags: ta, setUpFunction: caRef2) ,
98
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Ref3 " , runFunction: run_Array_method2xRef3, tags: ta, setUpFunction: caRef3) ,
99
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Ref4 " , runFunction: run_Array_method2xRef4, tags: ta, setUpFunction: caRef4) ,
100
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Val0 " , runFunction: run_Array_method2xVal0, tags: ta, setUpFunction: caVal0) ,
101
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Val1 " , runFunction: run_Array_method2xVal1, tags: ta, setUpFunction: caVal1) ,
102
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Val2 " , runFunction: run_Array_method2xVal2, tags: ta, setUpFunction: caVal2) ,
103
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Val3 " , runFunction: run_Array_method2xVal3, tags: ta, setUpFunction: caVal3) ,
104
+ BenchmarkInfo ( name: " Existential.Array.method.2x.Val4 " , runFunction: run_Array_method2xVal4, tags: ta, setUpFunction: caVal4) ,
105
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Ref1 " , runFunction: run_ArrayMutatingRef1, tags: ta, setUpFunction: caRef1) ,
106
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Ref2 " , runFunction: run_ArrayMutatingRef2, tags: ta, setUpFunction: caRef2) ,
107
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Ref3 " , runFunction: run_ArrayMutatingRef3, tags: ta, setUpFunction: caRef3) ,
108
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Ref4 " , runFunction: run_ArrayMutatingRef4, tags: ta, setUpFunction: caRef4) ,
109
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Val0 " , runFunction: run_ArrayMutatingVal0, tags: ta, setUpFunction: caVal0) ,
110
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Val1 " , runFunction: run_ArrayMutatingVal1, tags: ta, setUpFunction: caVal1) ,
111
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Val2 " , runFunction: run_ArrayMutatingVal2, tags: ta, setUpFunction: caVal2) ,
112
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Val3 " , runFunction: run_ArrayMutatingVal3, tags: ta, setUpFunction: caVal3) ,
113
+ BenchmarkInfo ( name: " Existential.Array.Mutating.Val4 " , runFunction: run_ArrayMutatingVal4, tags: ta, setUpFunction: caVal4) ,
114
+ BenchmarkInfo ( name: " Existential.Array.Shift.Ref1 " , runFunction: run_ArrayShiftRef1, tags: ta, setUpFunction: caRef1) ,
115
+ BenchmarkInfo ( name: " Existential.Array.Shift.Ref2 " , runFunction: run_ArrayShiftRef2, tags: ta, setUpFunction: caRef2) ,
116
+ BenchmarkInfo ( name: " Existential.Array.Shift.Ref3 " , runFunction: run_ArrayShiftRef3, tags: ta, setUpFunction: caRef3) ,
117
+ BenchmarkInfo ( name: " Existential.Array.Shift.Ref4 " , runFunction: run_ArrayShiftRef4, tags: ta, setUpFunction: caRef4) ,
118
+ BenchmarkInfo ( name: " Existential.Array.Shift.Val0 " , runFunction: run_ArrayShiftVal0, tags: ta, setUpFunction: caVal0) ,
119
+ BenchmarkInfo ( name: " Existential.Array.Shift.Val1 " , runFunction: run_ArrayShiftVal1, tags: ta, setUpFunction: caVal1) ,
120
+ BenchmarkInfo ( name: " Existential.Array.Shift.Val2 " , runFunction: run_ArrayShiftVal2, tags: ta, setUpFunction: caVal2) ,
121
+ BenchmarkInfo ( name: " Existential.Array.Shift.Val3 " , runFunction: run_ArrayShiftVal3, tags: ta, setUpFunction: caVal3) ,
122
+ BenchmarkInfo ( name: " Existential.Array.Shift.Val4 " , runFunction: run_ArrayShiftVal4, tags: ta, setUpFunction: caVal4) ,
123
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref1 " , runFunction: run_ArrayConditionalShiftRef1, tags: ta, setUpFunction: caRef1) ,
124
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref2 " , runFunction: run_ArrayConditionalShiftRef2, tags: ta, setUpFunction: caRef2) ,
125
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref3 " , runFunction: run_ArrayConditionalShiftRef3, tags: ta, setUpFunction: caRef3) ,
126
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Ref4 " , runFunction: run_ArrayConditionalShiftRef4, tags: ta, setUpFunction: caRef4) ,
127
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val0 " , runFunction: run_ArrayConditionalShiftVal0, tags: ta, setUpFunction: caVal0) ,
128
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val1 " , runFunction: run_ArrayConditionalShiftVal1, tags: ta, setUpFunction: caVal1) ,
129
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val2 " , runFunction: run_ArrayConditionalShiftVal2, tags: ta, setUpFunction: caVal2) ,
130
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val3 " , runFunction: run_ArrayConditionalShiftVal3, tags: ta, setUpFunction: caVal3) ,
131
+ BenchmarkInfo ( name: " Existential.Array.ConditionalShift.Val4 " , runFunction: run_ArrayConditionalShiftVal4, tags: ta, setUpFunction: caVal4) ,
123
132
]
124
133
134
+ // To exclude the setup overhead of existential array initialization,
135
+ // these are setup functions that **create array** for each variant type.
136
+ var array : [ Existential ] !
137
+ func ca< T: Existential > ( _: T . Type ) {
138
+ array = initExistentialArray ( withType: T . self, count: 128 )
139
+ }
140
+ func caVal0( ) { ca ( Val0 . self) }
141
+ func caVal1( ) { ca ( Val1 . self) }
142
+ func caVal2( ) { ca ( Val2 . self) }
143
+ func caVal3( ) { ca ( Val3 . self) }
144
+ func caVal4( ) { ca ( Val4 . self) }
145
+ func caRef1( ) { ca ( Ref1 . self) }
146
+ func caRef2( ) { ca ( Ref2 . self) }
147
+ func caRef3( ) { ca ( Ref3 . self) }
148
+ func caRef4( ) { ca ( Ref4 . self) }
149
+ @inline ( never)
150
+ func grabArray( ) -> [ Existential ] { // transfer array ownership to caller
151
+ // FIXME: This is causing Illegal Instruction: 4 crash
152
+ // defer { array = nil }
153
+ // return array
154
+ // This doesn't work either:
155
+ // let a = array!
156
+ // array = nil
157
+ // return a
158
+ return array!
159
+ }
160
+
125
161
protocol Existential {
126
162
init ( )
127
163
func doIt( ) -> Bool
@@ -374,8 +410,15 @@ func run_MutatingAndNonMutating<T: Existential>(withType: T.Type, numberOfTimes
374
410
}
375
411
}
376
412
413
+ func run_Array_init< T: Existential > ( withType: T . Type , numberOfTimes N: Int ) {
414
+
415
+ for _ in 0 ..< N * 20 {
416
+ blackHole ( initExistentialArray ( withType: T . self, count: 128 ) )
417
+ }
418
+ }
419
+
377
420
func run_Array_method1x< T: Existential > ( withType: T . Type , numberOfTimes N: Int ) {
378
- let existentialArray = initExistentialArray ( withType : T . self , count : 128 )
421
+ let existentialArray = grabArray ( )
379
422
for _ in 0 ..< N * 100 {
380
423
for elt in existentialArray {
381
424
if !elt. doIt ( ) {
@@ -386,7 +429,7 @@ func run_Array_method1x<T: Existential>(withType: T.Type, numberOfTimes N: Int)
386
429
}
387
430
388
431
func run_Array_method2x< T: Existential > ( withType: T . Type , numberOfTimes N: Int ) {
389
- let existentialArray = initExistentialArray ( withType : T . self , count : 128 )
432
+ let existentialArray = grabArray ( )
390
433
for _ in 0 ..< N * 100 {
391
434
for elt in existentialArray {
392
435
if !elt. doIt ( ) || !elt. reallyDoIt ( ) {
@@ -397,7 +440,7 @@ func run_Array_method2x<T: Existential>(withType: T.Type, numberOfTimes N: Int)
397
440
}
398
441
399
442
func run_ArrayMutating< T: Existential > ( withType: T . Type , numberOfTimes N: Int ) {
400
- var existentialArray = initExistentialArray ( withType : T . self , count : 128 )
443
+ var existentialArray = grabArray ( )
401
444
for _ in 0 ..< N * 100 {
402
445
for i in 0 ..< existentialArray. count {
403
446
if !existentialArray[ i] . mutateIt ( ) {
@@ -408,7 +451,7 @@ func run_ArrayMutating<T: Existential>(withType: T.Type, numberOfTimes N: Int) {
408
451
}
409
452
410
453
func run_ArrayShift< T: Existential > ( withType: T . Type , numberOfTimes N: Int ) {
411
- var existentialArray = initExistentialArray ( withType : T . self , count : 128 )
454
+ var existentialArray = grabArray ( )
412
455
for _ in 0 ..< N * 10 {
413
456
for i in 0 ..< existentialArray. count- 1 {
414
457
existentialArray. swapAt ( i, i+ 1 )
@@ -417,7 +460,7 @@ func run_ArrayShift<T: Existential>(withType: T.Type, numberOfTimes N: Int) {
417
460
}
418
461
419
462
func run_ArrayConditionalShift< T: Existential > ( withType: T . Type , numberOfTimes N: Int ) {
420
- var existentialArray = initExistentialArray ( withType : T . self , count : 128 )
463
+ var existentialArray = grabArray ( )
421
464
for _ in 0 ..< N * 10 {
422
465
for i in 0 ..< existentialArray. count- 1 {
423
466
let curr = existentialArray [ i]
@@ -603,6 +646,35 @@ public func run_MutatingAndNonMutatingRef4(_ N: Int) {
603
646
run_MutatingAndNonMutating ( withType: Ref4 . self, numberOfTimes: N)
604
647
}
605
648
649
+ // Array.init.
650
+ public func run_Array_initVal0( _ N: Int ) {
651
+ run_Array_init ( withType: Val0 . self, numberOfTimes: N)
652
+ }
653
+ public func run_Array_initVal1( _ N: Int ) {
654
+ run_Array_init ( withType: Val1 . self, numberOfTimes: N)
655
+ }
656
+ public func run_Array_initVal2( _ N: Int ) {
657
+ run_Array_init ( withType: Val2 . self, numberOfTimes: N)
658
+ }
659
+ public func run_Array_initVal3( _ N: Int ) {
660
+ run_Array_init ( withType: Val3 . self, numberOfTimes: N)
661
+ }
662
+ public func run_Array_initVal4( _ N: Int ) {
663
+ run_Array_init ( withType: Val4 . self, numberOfTimes: N)
664
+ }
665
+ public func run_Array_initRef1( _ N: Int ) {
666
+ run_Array_init ( withType: Ref1 . self, numberOfTimes: N)
667
+ }
668
+ public func run_Array_initRef2( _ N: Int ) {
669
+ run_Array_init ( withType: Ref2 . self, numberOfTimes: N)
670
+ }
671
+ public func run_Array_initRef3( _ N: Int ) {
672
+ run_Array_init ( withType: Ref3 . self, numberOfTimes: N)
673
+ }
674
+ public func run_Array_initRef4( _ N: Int ) {
675
+ run_Array_init ( withType: Ref4 . self, numberOfTimes: N)
676
+ }
677
+
606
678
// Array.method.1x.
607
679
public func run_Array_method1xVal0( _ N: Int ) {
608
680
run_Array_method1x ( withType: Val0 . self, numberOfTimes: N)
0 commit comments