Skip to content

Commit bc235af

Browse files
committed
[stdlib] Update reduce benchmark to compare the two forms
The ReduceInto benchmark performs three tasks using both `reduce(_:_)` and `reduce(into:_:)` so that their performance can be compared: 1. Summing an array, reducing to `Int` 2. Filtering an array, reducing to `[Int]` 3. Counting letter frequencies, reducing to `[Character: Int]`
1 parent b5d47fc commit bc235af

File tree

2 files changed

+48
-19
lines changed

2 files changed

+48
-19
lines changed

benchmark/single-source/ReduceInto.swift

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,56 +13,83 @@
1313
import TestsUtils
1414
import Foundation
1515

16+
// Sum
17+
1618
@inline(never)
17-
public func run_ReduceIntoInt(_ N: Int) {
19+
public func run_SumUsingReduce(_ N: Int) {
1820
let numbers = [Int](0..<1000)
21+
22+
var c = 0
23+
for _ in 1...N*1000 {
24+
c = c &+ numbers.reduce(0) { (acc: Int, num: Int) -> Int in
25+
acc &+ num
26+
}
27+
}
28+
CheckResults(c != 0)
29+
}
1930

31+
@inline(never)
32+
public func run_SumUsingReduceInto(_ N: Int) {
33+
let numbers = [Int](0..<1000)
34+
2035
var c = 0
21-
for _ in 1...N*100 {
36+
for _ in 1...N*1000 {
2237
c = c &+ numbers.reduce(into: 0) { (acc: inout Int, num: Int) in
2338
acc = acc &+ num
2439
}
2540
}
2641
CheckResults(c != 0)
2742
}
2843

44+
// Filter
45+
2946
@inline(never)
30-
public func run_ReduceIntoArray(_ N: Int) {
47+
public func run_FilterEvenUsingReduce(_ N: Int) {
3148
let numbers = [Int](0..<100)
3249

3350
var c = 0
3451
for _ in 1...N*100 {
35-
let a = numbers.reduce(into: []) { (acc: inout [Int], num: Int) in
36-
acc.append(num)
52+
let a = numbers.reduce([]) { (acc: [Int], num: Int) -> [Int] in
53+
var a = acc
54+
if num % 2 == 0 {
55+
a.append(num)
56+
}
57+
return a
3758
}
3859
c = c &+ a.count
3960
}
4061
CheckResults(c != 0)
4162
}
4263

4364
@inline(never)
44-
public func run_ReduceIntoDictionary(_ N: Int) {
65+
public func run_FilterEvenUsingReduceInto(_ N: Int) {
4566
let numbers = [Int](0..<100)
4667

4768
var c = 0
4869
for _ in 1...N*100 {
49-
let d = numbers.reduce(into: [:]) { (acc: inout [Int: Int], num: Int) in
50-
acc[num] = num
70+
let a = numbers.reduce(into: []) { (acc: inout [Int], num: Int) in
71+
if num % 2 == 0 {
72+
acc.append(num)
73+
}
5174
}
52-
c = c &+ d.count
75+
c = c &+ a.count
5376
}
5477
CheckResults(c != 0)
5578
}
5679

80+
// Frequencies
81+
5782
@inline(never)
58-
public func run_MapUsingReduceInto(_ N: Int) {
59-
let numbers = [Int](0..<100)
83+
public func run_FrequenciesUsingReduce(_ N: Int) {
84+
let s = "thequickbrownfoxjumpsoverthelazydogusingasmanycharacteraspossible123456789"
6085

6186
var c = 0
62-
let f: (Int) -> Int = { $0 &+ 5 }
6387
for _ in 1...N*100 {
64-
let a = numbers.reduce(into: []) { (acc: inout [Int], x: Int) in
65-
acc.append(f(x))
88+
let a = s.reduce([:]) {
89+
(acc: [Character: Int], c: Character) -> [Character: Int] in
90+
var d = acc
91+
d[c, default: 0] += 1
92+
return d
6693
}
6794
c = c &+ a.count
6895
}
@@ -75,7 +102,8 @@ public func run_FrequenciesUsingReduceInto(_ N: Int) {
75102

76103
var c = 0
77104
for _ in 1...N*100 {
78-
let a = s.reduce(into: [:]) { (acc: inout [Character: Int], c: Character) in
105+
let a = s.reduce(into: [:]) {
106+
(acc: inout [Character: Int], c: Character) in
79107
acc[c, default: 0] += 1
80108
}
81109
c = c &+ a.count

benchmark/utils/main.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@ addTo(&precommitTests, "EqualSubstringString", run_EqualSubstringString)
275275
addTo(&precommitTests, "EqualSubstringSubstring", run_EqualSubstringSubstring)
276276
addTo(&precommitTests, "EqualSubstringSubstringGenericEquatable", run_EqualSubstringSubstringGenericEquatable)
277277
addTo(&precommitTests, "ErrorHandling", run_ErrorHandling)
278+
addTo(&precommitTests, "FilterEvenUsingReduce", run_FilterEvenUsingReduce)
279+
addTo(&precommitTests, "FilterEvenUsingReduceInto", run_FilterEvenUsingReduceInto)
280+
addTo(&precommitTests, "FrequenciesUsingReduce", run_FrequenciesUsingReduce)
278281
addTo(&precommitTests, "FrequenciesUsingReduceInto", run_FrequenciesUsingReduceInto)
279282
addTo(&precommitTests, "Hanoi", run_Hanoi)
280283
addTo(&precommitTests, "HashTest", run_HashTest)
@@ -299,7 +302,6 @@ addTo(&precommitTests, "MapReduceSequence", run_MapReduceSequence)
299302
addTo(&precommitTests, "MapReduceShort", run_MapReduceShort)
300303
addTo(&precommitTests, "MapReduceShortString", run_MapReduceShortString)
301304
addTo(&precommitTests, "MapReduceString", run_MapReduceString)
302-
addTo(&precommitTests, "MapUsingReduceInto", run_MapUsingReduceInto)
303305
addTo(&precommitTests, "Memset", run_Memset)
304306
addTo(&precommitTests, "MonteCarloE", run_MonteCarloE)
305307
addTo(&precommitTests, "MonteCarloPi", run_MonteCarloPi)
@@ -390,9 +392,6 @@ addTo(&precommitTests, "RGBHistogram", run_RGBHistogram)
390392
addTo(&precommitTests, "RGBHistogramOfObjects", run_RGBHistogramOfObjects)
391393
addTo(&precommitTests, "RangeAssignment", run_RangeAssignment)
392394
addTo(&precommitTests, "RecursiveOwnedParameter", run_RecursiveOwnedParameter)
393-
addTo(&precommitTests, "ReduceIntoArray", run_ReduceIntoArray)
394-
addTo(&precommitTests, "ReduceIntoDictionary", run_ReduceIntoDictionary)
395-
addTo(&precommitTests, "ReduceIntoInt", run_ReduceIntoInt)
396395
addTo(&precommitTests, "ReversedArray", run_ReversedArray)
397396
addTo(&precommitTests, "ReversedBidirectional", run_ReversedBidirectional)
398397
addTo(&precommitTests, "ReversedDictionary", run_ReversedDictionary)
@@ -467,6 +466,8 @@ addTo(&precommitTests, "SuffixCountableRange", run_SuffixCountableRange)
467466
addTo(&precommitTests, "SuffixCountableRangeLazy", run_SuffixCountableRangeLazy)
468467
addTo(&precommitTests, "SuffixSequence", run_SuffixSequence)
469468
addTo(&precommitTests, "SuffixSequenceLazy", run_SuffixSequenceLazy)
469+
addTo(&precommitTests, "SumUsingReduce", run_SumUsingReduce)
470+
addTo(&precommitTests, "SumUsingReduceInto", run_SumUsingReduceInto)
470471
addTo(&precommitTests, "SuperChars", run_SuperChars)
471472
addTo(&precommitTests, "TwoSum", run_TwoSum)
472473
addTo(&precommitTests, "TypeFlood", run_TypeFlood)

0 commit comments

Comments
 (0)