Skip to content

Commit cbba7c7

Browse files
d-ronnqvistMax Moiseev
authored andcommitted
[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 4921a61 commit cbba7c7

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
@@ -239,6 +239,9 @@ addTo(&precommitTests, "EqualSubstringSubstring", run_EqualSubstringSubstring)
239239
addTo(&precommitTests, "EqualSubstringSubstringGenericEquatable", run_EqualSubstringSubstringGenericEquatable)
240240
addTo(&precommitTests, "ErrorHandling", run_ErrorHandling)
241241
addTo(&precommitTests, "GlobalClass", run_GlobalClass)
242+
addTo(&precommitTests, "FilterEvenUsingReduce", run_FilterEvenUsingReduce)
243+
addTo(&precommitTests, "FilterEvenUsingReduceInto", run_FilterEvenUsingReduceInto)
244+
addTo(&precommitTests, "FrequenciesUsingReduce", run_FrequenciesUsingReduce)
242245
addTo(&precommitTests, "FrequenciesUsingReduceInto", run_FrequenciesUsingReduceInto)
243246
addTo(&precommitTests, "Hanoi", run_Hanoi)
244247
addTo(&precommitTests, "HashTest", run_HashTest)
@@ -263,7 +266,6 @@ addTo(&precommitTests, "MapReduceSequence", run_MapReduceSequence)
263266
addTo(&precommitTests, "MapReduceShort", run_MapReduceShort)
264267
addTo(&precommitTests, "MapReduceShortString", run_MapReduceShortString)
265268
addTo(&precommitTests, "MapReduceString", run_MapReduceString)
266-
addTo(&precommitTests, "MapUsingReduceInto", run_MapUsingReduceInto)
267269
addTo(&precommitTests, "Memset", run_Memset)
268270
addTo(&precommitTests, "MonteCarloE", run_MonteCarloE)
269271
addTo(&precommitTests, "MonteCarloPi", run_MonteCarloPi)
@@ -354,9 +356,6 @@ addTo(&precommitTests, "RGBHistogram", run_RGBHistogram)
354356
addTo(&precommitTests, "RGBHistogramOfObjects", run_RGBHistogramOfObjects)
355357
addTo(&precommitTests, "RangeAssignment", run_RangeAssignment)
356358
addTo(&precommitTests, "RecursiveOwnedParameter", run_RecursiveOwnedParameter)
357-
addTo(&precommitTests, "ReduceIntoArray", run_ReduceIntoArray)
358-
addTo(&precommitTests, "ReduceIntoDictionary", run_ReduceIntoDictionary)
359-
addTo(&precommitTests, "ReduceIntoInt", run_ReduceIntoInt)
360359
addTo(&precommitTests, "ReversedArray", run_ReversedArray)
361360
addTo(&precommitTests, "ReversedBidirectional", run_ReversedBidirectional)
362361
addTo(&precommitTests, "ReversedDictionary", run_ReversedDictionary)
@@ -414,6 +413,8 @@ addTo(&precommitTests, "SuffixCountableRange", run_SuffixCountableRange)
414413
addTo(&precommitTests, "SuffixCountableRangeLazy", run_SuffixCountableRangeLazy)
415414
addTo(&precommitTests, "SuffixSequence", run_SuffixSequence)
416415
addTo(&precommitTests, "SuffixSequenceLazy", run_SuffixSequenceLazy)
416+
addTo(&precommitTests, "SumUsingReduce", run_SumUsingReduce)
417+
addTo(&precommitTests, "SumUsingReduceInto", run_SumUsingReduceInto)
417418
addTo(&precommitTests, "SuperChars", run_SuperChars)
418419
addTo(&precommitTests, "TwoSum", run_TwoSum)
419420
addTo(&precommitTests, "TypeFlood", run_TypeFlood)

0 commit comments

Comments
 (0)