Skip to content

Commit fb5734c

Browse files
authored
Merge pull request #9575 from milseman/unihan_fasterhan
[stdlib] String: Walk Chinese/Japanese faster: 2x/4x forwards/backwards
2 parents ff26227 + 075c6e6 commit fb5734c

File tree

4 files changed

+329
-60
lines changed

4 files changed

+329
-60
lines changed
Lines changed: 152 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===--- StringWalk.swift -------------------------------------------------===//
1+
//===--- StringWalk.swift -------------------------------------*- swift -*-===//
22
//
33
// This source file is part of the Swift.org open source project
44
//
@@ -10,6 +10,13 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
////////////////////////////////////////////////////////////////////////////////
14+
// WARNING: This file is manually generated from .gyb template and should not
15+
// be directly modified. Instead, make changes to DropWhile.swift.gyb and run
16+
// scripts/generate_harness/generate_harness.py to regenerate this file.
17+
////////////////////////////////////////////////////////////////////////////////
18+
19+
1320
// Test String subscript performance.
1421
//
1522
// Subscript has a slow path that initializes a global variable:
@@ -26,25 +33,25 @@ var count: Int = 0
2633
// Helper functionality
2734
//
2835

29-
@inline(never) func countScalars(_ s: String.UnicodeScalarView) {
36+
@inline(never) func count_unicodeScalars(_ s: String.UnicodeScalarView) {
3037
for _ in s {
3138
count += 1
3239
}
3340
}
34-
@inline(never) func countCharacters(_ s: String.CharacterView) {
41+
@inline(never) func count_characters(_ s: String.CharacterView) {
3542
for _ in s {
3643
count += 1
3744
}
3845
}
39-
@inline(never) func countScalars_rev(
40-
_ s: ReversedCollection<String.UnicodeScalarView>
46+
@inline(never) func count_unicodeScalars_rev(
47+
_ s: ReversedCollection<String.UnicodeScalarView>
4148
) {
4249
for _ in s {
4350
count += 1
4451
}
4552
}
46-
@inline(never) func countCharacters_rev(
47-
_ s: ReversedCollection<String.CharacterView>
53+
@inline(never) func count_characters_rev(
54+
_ s: ReversedCollection<String.CharacterView>
4855
) {
4956
for _ in s {
5057
count += 1
@@ -54,15 +61,18 @@ var count: Int = 0
5461
//
5562
// Workloads
5663
//
57-
let asciiString =
64+
let ascii =
5865
"siebenhundertsiebenundsiebzigtausendsiebenhundertsiebenundsiebzig"
59-
let winter = "🏂☃❅❆❄︎⛄️❄️"
60-
let utf16String =
61-
winter + "the quick brown fox" + String(winter.characters.reversed())
66+
let emoji = "👍👩‍👩‍👧‍👧👨‍👨‍👦‍👦🇺🇸🇨🇦🇲🇽👍🏻👍🏼👍🏽👍🏾👍🏿"
67+
let utf16 = emoji + "the quick brown fox" + String(emoji.reversed() as Array<Character>)
68+
69+
let japanese = "今回のアップデートでSwiftに大幅な改良が施され、安定していてしかも直感的に使うことができるAppleプラットフォーム向けプログラミング言語になりました。"
70+
let chinese = "Swift 是面向 Apple 平台的编程语言,功能强大且直观易用,而本次更新对其进行了全面优化。"
71+
let korean = "이번 업데이트에서는 강력하면서도 직관적인 Apple 플랫폼용 프로그래밍 언어인 Swift를 완벽히 개선하였습니다."
6272

6373
// A workload that's mostly Latin characters, with occasional emoji
6474
// interspersed. Common for tweets.
65-
let tweetString = "Worst thing about working on String is that it breaks *everything*. Asserts, debuggers, and *especially* printf-style debugging 😭"
75+
let tweet = "Worst thing about working on String is that it breaks *everything*. Asserts, debuggers, and *especially* printf-style debugging 😭"
6676

6777
//
6878
// Benchmarks
@@ -71,94 +81,191 @@ let tweetString = "Worst thing about working on String is that it breaks *everyt
7181
// Pre-commit benchmark: simple scalar walk
7282
@inline(never)
7383
public func run_StringWalk(_ N: Int) {
74-
return run_StringWalkASCIIScalars(N)
84+
return run_StringWalk_ascii_unicodeScalars(N)
7585
}
7686

7787
// Extended String benchmarks:
78-
let baseMultiplier = 50_000
79-
let scalarsMultiplier = baseMultiplier
88+
let baseMultiplier = 10_000
89+
let unicodeScalarsMultiplier = baseMultiplier
8090
let charactersMultiplier = baseMultiplier / 5
8191

92+
93+
@inline(never)
94+
public func run_StringWalk_ascii_unicodeScalars(_ N: Int) {
95+
for _ in 1...unicodeScalarsMultiplier*N {
96+
count_unicodeScalars(ascii.unicodeScalars)
97+
}
98+
}
99+
100+
@inline(never)
101+
public func run_StringWalk_ascii_unicodeScalars_Backwards(_ N: Int) {
102+
for _ in 1...unicodeScalarsMultiplier*N {
103+
count_unicodeScalars_rev(ascii.unicodeScalars.reversed())
104+
}
105+
}
106+
107+
82108
@inline(never)
83-
public func run_StringWalkASCIIScalars(_ N: Int) {
84-
for _ in 1...scalarsMultiplier*N {
85-
countScalars(asciiString.unicodeScalars)
109+
public func run_StringWalk_ascii_characters(_ N: Int) {
110+
for _ in 1...charactersMultiplier*N {
111+
count_characters(ascii.characters)
86112
}
87113
}
88114

89115
@inline(never)
90-
public func run_StringWalkASCIICharacters(_ N: Int) {
116+
public func run_StringWalk_ascii_characters_Backwards(_ N: Int) {
91117
for _ in 1...charactersMultiplier*N {
92-
countCharacters(asciiString.characters)
118+
count_characters_rev(ascii.characters.reversed())
93119
}
94120
}
95121

122+
96123
@inline(never)
97-
public func run_StringWalkUnicodeScalars(_ N: Int) {
98-
for _ in 1...scalarsMultiplier*N {
99-
countScalars(utf16String.unicodeScalars)
124+
public func run_StringWalk_utf16_unicodeScalars(_ N: Int) {
125+
for _ in 1...unicodeScalarsMultiplier*N {
126+
count_unicodeScalars(utf16.unicodeScalars)
100127
}
101128
}
102129

103130
@inline(never)
104-
public func run_StringWalkUnicodeCharacters(_ N: Int) {
131+
public func run_StringWalk_utf16_unicodeScalars_Backwards(_ N: Int) {
132+
for _ in 1...unicodeScalarsMultiplier*N {
133+
count_unicodeScalars_rev(utf16.unicodeScalars.reversed())
134+
}
135+
}
136+
137+
138+
@inline(never)
139+
public func run_StringWalk_utf16_characters(_ N: Int) {
105140
for _ in 1...charactersMultiplier*N {
106-
countCharacters(utf16String.characters)
141+
count_characters(utf16.characters)
107142
}
108143
}
109144

110145
@inline(never)
111-
public func run_StringWalkMixedScalars(_ N: Int) {
112-
for _ in 1...scalarsMultiplier*N {
113-
countScalars(tweetString.unicodeScalars)
146+
public func run_StringWalk_utf16_characters_Backwards(_ N: Int) {
147+
for _ in 1...charactersMultiplier*N {
148+
count_characters_rev(utf16.characters.reversed())
149+
}
150+
}
151+
152+
153+
@inline(never)
154+
public func run_StringWalk_tweet_unicodeScalars(_ N: Int) {
155+
for _ in 1...unicodeScalarsMultiplier*N {
156+
count_unicodeScalars(tweet.unicodeScalars)
157+
}
158+
}
159+
160+
@inline(never)
161+
public func run_StringWalk_tweet_unicodeScalars_Backwards(_ N: Int) {
162+
for _ in 1...unicodeScalarsMultiplier*N {
163+
count_unicodeScalars_rev(tweet.unicodeScalars.reversed())
164+
}
165+
}
166+
167+
168+
@inline(never)
169+
public func run_StringWalk_tweet_characters(_ N: Int) {
170+
for _ in 1...charactersMultiplier*N {
171+
count_characters(tweet.characters)
114172
}
115173
}
116174

117175
@inline(never)
118-
public func run_StringWalkMixedCharacters(_ N: Int) {
176+
public func run_StringWalk_tweet_characters_Backwards(_ N: Int) {
119177
for _ in 1...charactersMultiplier*N {
120-
countCharacters(tweetString.characters)
178+
count_characters_rev(tweet.characters.reversed())
179+
}
180+
}
181+
182+
183+
@inline(never)
184+
public func run_StringWalk_japanese_unicodeScalars(_ N: Int) {
185+
for _ in 1...unicodeScalarsMultiplier*N {
186+
count_unicodeScalars(japanese.unicodeScalars)
187+
}
188+
}
189+
190+
@inline(never)
191+
public func run_StringWalk_japanese_unicodeScalars_Backwards(_ N: Int) {
192+
for _ in 1...unicodeScalarsMultiplier*N {
193+
count_unicodeScalars_rev(japanese.unicodeScalars.reversed())
121194
}
122195
}
123196

197+
124198
@inline(never)
125-
public func run_StringWalkASCIIScalarsBackwards(_ N: Int) {
126-
for _ in 1...scalarsMultiplier*N {
127-
countScalars_rev(asciiString.unicodeScalars.reversed())
199+
public func run_StringWalk_japanese_characters(_ N: Int) {
200+
for _ in 1...charactersMultiplier*N {
201+
count_characters(japanese.characters)
128202
}
129203
}
130204

131205
@inline(never)
132-
public func run_StringWalkASCIICharactersBackwards(_ N: Int) {
206+
public func run_StringWalk_japanese_characters_Backwards(_ N: Int) {
133207
for _ in 1...charactersMultiplier*N {
134-
countCharacters_rev(asciiString.characters.reversed())
208+
count_characters_rev(japanese.characters.reversed())
135209
}
136210
}
137211

212+
138213
@inline(never)
139-
public func run_StringWalkUnicodeScalarsBackwards(_ N: Int) {
140-
for _ in 1...scalarsMultiplier*N {
141-
countScalars_rev(utf16String.unicodeScalars.reversed())
214+
public func run_StringWalk_chinese_unicodeScalars(_ N: Int) {
215+
for _ in 1...unicodeScalarsMultiplier*N {
216+
count_unicodeScalars(chinese.unicodeScalars)
142217
}
143218
}
144219

145220
@inline(never)
146-
public func run_StringWalkUnicodeCharactersBackwards(_ N: Int) {
221+
public func run_StringWalk_chinese_unicodeScalars_Backwards(_ N: Int) {
222+
for _ in 1...unicodeScalarsMultiplier*N {
223+
count_unicodeScalars_rev(chinese.unicodeScalars.reversed())
224+
}
225+
}
226+
227+
228+
@inline(never)
229+
public func run_StringWalk_chinese_characters(_ N: Int) {
147230
for _ in 1...charactersMultiplier*N {
148-
countCharacters_rev(utf16String.characters.reversed())
231+
count_characters(chinese.characters)
149232
}
150233
}
151234

152235
@inline(never)
153-
public func run_StringWalkMixedScalarsBackwards(_ N: Int) {
154-
for _ in 1...scalarsMultiplier*N {
155-
countScalars_rev(tweetString.unicodeScalars.reversed())
236+
public func run_StringWalk_chinese_characters_Backwards(_ N: Int) {
237+
for _ in 1...charactersMultiplier*N {
238+
count_characters_rev(chinese.characters.reversed())
156239
}
157240
}
158241

242+
159243
@inline(never)
160-
public func run_StringWalkMixedCharactersBackwards(_ N: Int) {
244+
public func run_StringWalk_korean_unicodeScalars(_ N: Int) {
245+
for _ in 1...unicodeScalarsMultiplier*N {
246+
count_unicodeScalars(korean.unicodeScalars)
247+
}
248+
}
249+
250+
@inline(never)
251+
public func run_StringWalk_korean_unicodeScalars_Backwards(_ N: Int) {
252+
for _ in 1...unicodeScalarsMultiplier*N {
253+
count_unicodeScalars_rev(korean.unicodeScalars.reversed())
254+
}
255+
}
256+
257+
258+
@inline(never)
259+
public func run_StringWalk_korean_characters(_ N: Int) {
260+
for _ in 1...charactersMultiplier*N {
261+
count_characters(korean.characters)
262+
}
263+
}
264+
265+
@inline(never)
266+
public func run_StringWalk_korean_characters_Backwards(_ N: Int) {
161267
for _ in 1...charactersMultiplier*N {
162-
countCharacters_rev(tweetString.characters.reversed())
268+
count_characters_rev(korean.characters.reversed())
163269
}
164270
}
271+

0 commit comments

Comments
 (0)