Skip to content

Commit f6b453f

Browse files
committed
[benchmark] Add some distance(from:to:) benchmarks for String views
1 parent 60952b8 commit f6b453f

File tree

3 files changed

+132
-1
lines changed

3 files changed

+132
-1
lines changed

benchmark/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ set(SWIFT_BENCH_MODULES
179179
single-source/StrToInt
180180
single-source/StringBuilder
181181
single-source/StringComparison
182+
single-source/StringDistance
182183
single-source/StringEdits
183184
single-source/StringEnum
184185
single-source/StringInterpolation
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
//===--- StringEdits.swift ------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import TestsUtils
14+
15+
public let benchmarks: [BenchmarkInfo] = [
16+
BenchmarkInfo(
17+
name: "StringDistance.characters",
18+
runFunction: { n in
19+
run_characters(string: sampleString, ranges: sampleRanges, n: n)
20+
},
21+
tags: [.api, .String],
22+
setUpFunction: { _ = sampleRanges }),
23+
BenchmarkInfo(
24+
name: "StringDistance.scalars",
25+
runFunction: { n in
26+
run_scalars(string: sampleString, ranges: sampleRanges, n: n)
27+
},
28+
tags: [.api, .String],
29+
setUpFunction: { _ = sampleRanges }),
30+
BenchmarkInfo(
31+
name: "StringDistance.utf16",
32+
runFunction: { n in
33+
run_utf16(string: sampleString, ranges: sampleRanges, n: n)
34+
},
35+
tags: [.api, .String],
36+
setUpFunction: { _ = sampleRanges }),
37+
BenchmarkInfo(
38+
name: "StringDistance.utf8",
39+
runFunction: { n in
40+
run_utf8(string: sampleString, ranges: sampleRanges, n: n)
41+
},
42+
tags: [.api, .String],
43+
setUpFunction: { _ = sampleRanges }),
44+
]
45+
46+
47+
let sampleString =
48+
#"""
49+
The powerful programming language that is also easy to learn.
50+
손쉽게 학습할 수 있는 강력한 프로그래밍 언어.
51+
🪙 A 🥞 short 🍰 piece 🫘 of 🌰 text 👨‍👨‍👧‍👧 with 👨‍👩‍👦 some 🚶🏽 emoji 🇺🇸🇨🇦 characters 🧈
52+
some🔩times 🛺 placed 🎣 in 🥌 the 🆘 mid🔀dle 🇦🇶or🏁 around 🏳️‍🌈 a 🍇 w🍑o🥒r🥨d
53+
Unicode is such fun!
54+
U̷n̷i̷c̷o̴d̴e̷ ̶i̸s̷ ̸s̵u̵c̸h̷ ̸f̵u̷n̴!̵
55+
U̴̡̲͋̾n̵̻̳͌ì̶̠̕c̴̭̈͘ǫ̷̯͋̊d̸͖̩̈̈́ḛ̴́ ̴̟͎͐̈i̴̦̓s̴̜̱͘ ̶̲̮̚s̶̙̞͘u̵͕̯̎̽c̵̛͕̜̓h̶̘̍̽ ̸̜̞̿f̵̤̽ṷ̴͇̎͘ń̷͓̒!̷͍̾̚
56+
U̷̢̢̧̨̼̬̰̪͓̞̠͔̗̼̙͕͕̭̻̗̮̮̥̣͉̫͉̬̲̺͍̺͊̂ͅn̶̨̢̨̯͓̹̝̲̣̖̞̼̺̬̤̝̊̌́̑̋̋͜͝ͅḭ̸̦̺̺͉̳͎́͑c̵̛̘̥̮̙̥̟̘̝͙̤̮͉͔̭̺̺̅̀̽̒̽̏̊̆͒͌̂͌̌̓̈́̐̔̿̂͑͠͝͝ͅö̶̱̠̱̤̙͚͖̳̜̰̹̖̣̻͎͉̞̫̬̯͕̝͔̝̟̘͔̙̪̭̲́̆̂͑̌͂̉̀̓́̏̎̋͗͛͆̌̽͌̄̎̚͝͝͝͝ͅd̶̨̨̡̡͙̟͉̱̗̝͙͍̮͍̘̮͔͑e̶̢͕̦̜͔̘̘̝͈̪̖̺̥̺̹͉͎͈̫̯̯̻͑͑̿̽͂̀̽͋́̎̈́̈̿͆̿̒̈́̽̔̇͐͛̀̓͆̏̾̀̌̈́̆̽̕ͅ ̷̢̳̫̣̼̙̯̤̬̥̱͓̹͇̽̄̄̋̿̐̇̌̒̾̑̆̈́̏͐̒̈̋̎͐̿̽̆̉͋͊̀̍͘̕̕̕͝͠͠͝ͅͅì̸̢̧̨̨̮͇̤͍̭̜̗̪̪͖̭͇͔̜̗͈̫̩͔̗͔̜̖̲̱͍̗̱̩͍̘̜̙̩͔̏̋̓̊́́̋̐̌͊͘̕͠s̶̨̢̧̥̲̖̝̩͖̱͋́͑͐̇̐̔̀̉͒͒́̐̉̔͘͠͠ ̵̧̛͕̦̭̣̝̩͕̠͎̮͓͉̟̠̘͎͋͗͆̋̌̓̃̏̊̔̾̒̿s̸̟͚̪̘̰̮͉̖̝̅̓͛̏̆ư̵͍̙̠͍̜͖͔̮̠̦̤̣̯̘̲͍͂͌̌̅̍͌̈́̆̋̎͋̓̍͆̃̑͌͘̕͜ͅç̸̟̗͉̟̤̙̹͓̖͇̳̈́̍̏͐̓̓̈̆̉̈͆̍ͅh̵̛̛̹̪͇͓̤̺̟͙̣̰͓̺̩̤̘̫͔̺͙͌́̑̓͗̏͆́͊̈́̋̿͒̐̀́̌͜͜͝ ̴̗͓͚͖̣̥͛́̓͐͂͛̐͑̈́͗̂̈͠f̶̡̩̟̤̭̩̱̥͈̼̥̳͕̣͓̱̰͎̖̦͎̦̻̫͉̝̗̝͚̎͌͑̾̿̊̉͆̉̏̅̔̓̈́̀͐̚͘ͅư̷̦̮͖͙̺̱̼̜̺̤͎̜͐͐̊̊̈͋̔̓̍͊̇̊̈́̈͑̐̎̿̑̋͋̀̅̓͛̚͜n̷̡̨͉̠̖̙͎̳̠̦̼̻̲̳̿̀̓̍͋̎͆̓̇̾̅͊̐͘͘̕!̷̡̨̧̢̡̡̼̹̭̝̝̭̫̫̥̰̤̪̦̤̼̖̖̳̰̲͙͕̖̬̳̪͖̹̮͐͐͊̈́̐͑͛̾̈͊̊͋͑̉͒̈̿̈̃̑͋͐́͊̀͝͠͝͠
57+
"""#
58+
59+
let sampleRanges = (
60+
generateRanges(for: sampleString, by: 1)
61+
+ generateRanges(for: sampleString, by: 2)
62+
+ generateRanges(for: sampleString, by: 4)
63+
+ generateRanges(for: sampleString, by: 8)
64+
+ generateRanges(for: sampleString, by: 16)
65+
+ generateRanges(for: sampleString, by: 32)
66+
+ generateRanges(for: sampleString, by: 64)
67+
+ generateRanges(for: sampleString, by: 128)
68+
+ generateRanges(for: sampleString, by: 256)
69+
+ generateRanges(for: sampleString, by: 512))
70+
71+
func generateRanges(for string: String, by step: Int) -> [Range<String.Index>] {
72+
var remaining = step
73+
var i = string.startIndex
74+
var last = i
75+
76+
var ranges: [Range<String.Index>] = []
77+
while i < string.endIndex {
78+
string.unicodeScalars.formIndex(after: &i)
79+
remaining -= 1
80+
if remaining == 0 {
81+
ranges.append(last ..< i)
82+
remaining = step
83+
last = i
84+
}
85+
}
86+
ranges.append(last ..< i)
87+
return ranges
88+
}
89+
90+
func run_characters(string: String, ranges: [Range<String.Index>], n: Int) {
91+
var c = 0
92+
for _ in 0 ..< n {
93+
for r in ranges {
94+
c += string.distance(from: r.lowerBound, to: r.upperBound)
95+
}
96+
}
97+
blackHole(c)
98+
}
99+
100+
func run_scalars(string: String, ranges: [Range<String.Index>], n: Int) {
101+
var c = 0
102+
for _ in 0 ..< n {
103+
for r in ranges {
104+
c += string.unicodeScalars.distance(from: r.lowerBound, to: r.upperBound)
105+
}
106+
}
107+
blackHole(c)
108+
}
109+
110+
func run_utf16(string: String, ranges: [Range<String.Index>], n: Int) {
111+
var c = 0
112+
for _ in 0 ..< n {
113+
for r in ranges {
114+
c += string.utf16.distance(from: r.lowerBound, to: r.upperBound)
115+
}
116+
}
117+
blackHole(c)
118+
}
119+
120+
func run_utf8(string: String, ranges: [Range<String.Index>], n: Int) {
121+
var c = 0
122+
for _ in 0 ..< n {
123+
for r in ranges {
124+
c += string.utf8.distance(from: r.lowerBound, to: r.upperBound)
125+
}
126+
}
127+
blackHole(c)
128+
}

benchmark/utils/main.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ import StrComplexWalk
178178
import StrToInt
179179
import StringBuilder
180180
import StringComparison
181+
import StringDistance
181182
import StringEdits
182183
import StringEnum
183184
import StringInterpolation
@@ -362,9 +363,10 @@ register(StaticArray.benchmarks)
362363
register(StrComplexWalk.benchmarks)
363364
register(StrToInt.benchmarks)
364365
register(StringBuilder.benchmarks)
366+
register(StringComparison.benchmarks)
367+
register(StringDistance.benchmarks)
365368
register(StringEdits.benchmarks)
366369
register(StringEnum.benchmarks)
367-
register(StringComparison.benchmarks)
368370
register(StringInterpolation.benchmarks)
369371
register(StringMatch.benchmarks)
370372
register(StringRemoveDupes.benchmarks)

0 commit comments

Comments
 (0)