Skip to content

Commit bd59bf1

Browse files
authored
Merge pull request #20123 from palimondo/just-eyes
[benchmark] Reduce unreasonable setup times
2 parents 6a29428 + ca2a52b commit bd59bf1

File tree

3 files changed

+48
-123
lines changed

3 files changed

+48
-123
lines changed

benchmark/single-source/CharacterProperties.swift

Lines changed: 20 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -253,133 +253,57 @@ func setupMemo() {
253253
}
254254

255255
// Precompute whole scalar set
256-
var controlCharactersPrecomputed: Set<UInt32> = {
256+
func precompute(_ charSet: CharacterSet) -> Set<UInt32> {
257257
var result = Set<UInt32>()
258-
for i in 0...0x0010_FFFF {
259-
guard let scalar = UnicodeScalar(i) else { continue }
260-
if controlCharacters.contains(scalar) {
261-
result.insert(scalar.value)
258+
for plane in 0...0x10 {
259+
guard charSet.hasMember(inPlane: UInt8(plane)) else { continue }
260+
let offset = plane &* 0x1_0000
261+
for codePoint in 0...0xFFFF {
262+
guard let scalar = UnicodeScalar(codePoint &+ offset) else { continue }
263+
if charSet.contains(scalar) {
264+
result.insert(scalar.value)
265+
}
262266
}
263267
}
264268
return result
265-
}()
269+
}
270+
var controlCharactersPrecomputed: Set<UInt32> = precompute(controlCharacters)
266271
func isControlPrecomputed(_ c: Character) -> Bool {
267272
return controlCharactersPrecomputed.contains(c.firstScalar.value)
268273
}
269-
var alphanumericsPrecomputed: Set<UInt32> = {
270-
var result = Set<UInt32>()
271-
for i in 0...0x0010_FFFF {
272-
guard let scalar = UnicodeScalar(i) else { continue }
273-
if alphanumerics.contains(scalar) {
274-
result.insert(scalar.value)
275-
}
276-
}
277-
return result
278-
}()
274+
var alphanumericsPrecomputed: Set<UInt32> = precompute(alphanumerics)
279275
func isAlphanumericPrecomputed(_ c: Character) -> Bool {
280276
return alphanumericsPrecomputed.contains(c.firstScalar.value)
281277
}
282-
var lowercaseLettersPrecomputed: Set<UInt32> = {
283-
var result = Set<UInt32>()
284-
for i in 0...0x0010_FFFF {
285-
guard let scalar = UnicodeScalar(i) else { continue }
286-
if lowercaseLetters.contains(scalar) {
287-
result.insert(scalar.value)
288-
}
289-
}
290-
return result
291-
}()
278+
var lowercaseLettersPrecomputed: Set<UInt32> = precompute(lowercaseLetters)
292279
func isLowercasePrecomputed(_ c: Character) -> Bool {
293280
return lowercaseLettersPrecomputed.contains(c.firstScalar.value)
294281
}
295-
var punctuationCharactersPrecomputed: Set<UInt32> = {
296-
var result = Set<UInt32>()
297-
for i in 0...0x0010_FFFF {
298-
guard let scalar = UnicodeScalar(i) else { continue }
299-
if punctuationCharacters.contains(scalar) {
300-
result.insert(scalar.value)
301-
}
302-
}
303-
return result
304-
}()
282+
var punctuationCharactersPrecomputed: Set<UInt32> = precompute(punctuationCharacters)
305283
func isPunctuationPrecomputed(_ c: Character) -> Bool {
306284
return punctuationCharactersPrecomputed.contains(c.firstScalar.value)
307285
}
308-
var whitespacesPrecomputed: Set<UInt32> = {
309-
var result = Set<UInt32>()
310-
for i in 0...0x0010_FFFF {
311-
guard let scalar = UnicodeScalar(i) else { continue }
312-
if whitespaces.contains(scalar) {
313-
result.insert(scalar.value)
314-
}
315-
}
316-
return result
317-
}()
286+
var whitespacesPrecomputed: Set<UInt32> = precompute(whitespaces)
318287
func isWhitespacePrecomputed(_ c: Character) -> Bool {
319288
return whitespacesPrecomputed.contains(c.firstScalar.value)
320289
}
321-
var lettersPrecomputed: Set<UInt32> = {
322-
var result = Set<UInt32>()
323-
for i in 0...0x0010_FFFF {
324-
guard let scalar = UnicodeScalar(i) else { continue }
325-
if letters.contains(scalar) {
326-
result.insert(scalar.value)
327-
}
328-
}
329-
return result
330-
}()
290+
var lettersPrecomputed: Set<UInt32> = precompute(letters)
331291
func isLetterPrecomputed(_ c: Character) -> Bool {
332292
return lettersPrecomputed.contains(c.firstScalar.value)
333293
}
334-
var uppercaseLettersPrecomputed: Set<UInt32> = {
335-
var result = Set<UInt32>()
336-
for i in 0...0x0010_FFFF {
337-
guard let scalar = UnicodeScalar(i) else { continue }
338-
if uppercaseLetters.contains(scalar) {
339-
result.insert(scalar.value)
340-
}
341-
}
342-
return result
343-
}()
294+
var uppercaseLettersPrecomputed: Set<UInt32> = precompute(uppercaseLetters)
344295
func isUppercasePrecomputed(_ c: Character) -> Bool {
345296
return uppercaseLettersPrecomputed.contains(c.firstScalar.value)
346297
}
347-
var decimalDigitsPrecomputed: Set<UInt32> = {
348-
var result = Set<UInt32>()
349-
for i in 0...0x0010_FFFF {
350-
guard let scalar = UnicodeScalar(i) else { continue }
351-
if decimalDigits.contains(scalar) {
352-
result.insert(scalar.value)
353-
}
354-
}
355-
return result
356-
}()
298+
var decimalDigitsPrecomputed: Set<UInt32> = precompute(decimalDigits)
357299
func isDecimalPrecomputed(_ c: Character) -> Bool {
358300
return decimalDigitsPrecomputed.contains(c.firstScalar.value)
359301
}
360-
var newlinesPrecomputed: Set<UInt32> = {
361-
var result = Set<UInt32>()
362-
for i in 0...0x0010_FFFF {
363-
guard let scalar = UnicodeScalar(i) else { continue }
364-
if newlines.contains(scalar) {
365-
result.insert(scalar.value)
366-
}
367-
}
368-
return result
369-
}()
302+
var newlinesPrecomputed: Set<UInt32> = precompute(newlines)
370303
func isNewlinePrecomputed(_ c: Character) -> Bool {
371304
return newlinesPrecomputed.contains(c.firstScalar.value)
372305
}
373-
var capitalizedLettersPrecomputed: Set<UInt32> = {
374-
var result = Set<UInt32>()
375-
for i in 0...0x0010_FFFF {
376-
guard let scalar = UnicodeScalar(i) else { continue }
377-
if capitalizedLetters.contains(scalar) {
378-
result.insert(scalar.value)
379-
}
380-
}
381-
return result
382-
}()
306+
var capitalizedLettersPrecomputed: Set<UInt32> = precompute(capitalizedLetters)
383307
func isCapitalizedPrecomputed(_ c: Character) -> Bool {
384308
return capitalizedLettersPrecomputed.contains(c.firstScalar.value)
385309
}

benchmark/single-source/CharacterProperties.swift.gyb

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,22 @@ func setupMemo() {
104104
}
105105

106106
// Precompute whole scalar set
107-
% for Property, Set in Properties.items():
108-
var ${Set}Precomputed: Set<UInt32> = {
107+
func precompute(_ charSet: CharacterSet) -> Set<UInt32> {
109108
var result = Set<UInt32>()
110-
for i in 0...0x0010_FFFF {
111-
guard let scalar = UnicodeScalar(i) else { continue }
112-
if ${Set}.contains(scalar) {
113-
result.insert(scalar.value)
109+
for plane in 0...0x10 {
110+
guard charSet.hasMember(inPlane: UInt8(plane)) else { continue }
111+
let offset = plane &* 0x1_0000
112+
for codePoint in 0...0xFFFF {
113+
guard let scalar = UnicodeScalar(codePoint &+ offset) else { continue }
114+
if charSet.contains(scalar) {
115+
result.insert(scalar.value)
116+
}
114117
}
115118
}
116119
return result
117-
}()
120+
}
121+
% for Property, Set in Properties.items():
122+
var ${Set}Precomputed: Set<UInt32> = precompute(${Set})
118123
func is${Property}Precomputed(_ c: Character) -> Bool {
119124
return ${Set}Precomputed.contains(c.firstScalar.value)
120125
}

benchmark/single-source/DictionaryKeysContains.swift

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,53 +21,50 @@ public let DictionaryKeysContains = [
2121
name: "DictionaryKeysContainsNative",
2222
runFunction: run_DictionaryKeysContains,
2323
tags: [.validation, .api, .Dictionary],
24-
setUpFunction: setup_DictionaryKeysContainsNative,
25-
tearDownFunction: teardown_DictionaryKeysContains),
24+
setUpFunction: setupNativeDictionary,
25+
tearDownFunction: teardownDictionary,
26+
unsupportedPlatforms: [.linux]),
2627
BenchmarkInfo(
2728
name: "DictionaryKeysContainsCocoa",
2829
runFunction: run_DictionaryKeysContains,
2930
tags: [.validation, .api, .Dictionary],
30-
setUpFunction: setup_DictionaryKeysContainsCocoa,
31-
tearDownFunction: teardown_DictionaryKeysContains),
31+
setUpFunction: setupBridgedDictionary,
32+
tearDownFunction: teardownDictionary),
3233
]
3334
#else
3435
public let DictionaryKeysContains = [
3536
BenchmarkInfo(
3637
name: "DictionaryKeysContainsNative",
3738
runFunction: run_DictionaryKeysContains,
3839
tags: [.validation, .api, .Dictionary],
39-
setUpFunction: setup_DictionaryKeysContainsNative,
40-
tearDownFunction: teardown_DictionaryKeysContains,
40+
setUpFunction: setupNativeDictionary,
41+
tearDownFunction: teardownDictionary,
4142
unsupportedPlatforms: [.linux]),
4243
]
4344
#endif
4445

4546
private var dictionary: [NSString: NSString]!
4647

47-
private func setup_DictionaryKeysContainsNative() {
48+
private func setupNativeDictionary() {
4849
#if os(Linux)
4950
fatalError("Unsupported benchmark")
5051
#else
51-
let keyValuePairs = (1...1_000_000).map {
52-
("\($0)" as NSString, "\($0)" as NSString)
52+
let keyValuePair: (Int) -> (NSString, NSString) = {
53+
let n = "\($0)" as NSString; return (n, n)
5354
}
54-
dictionary = [NSString: NSString](uniqueKeysWithValues: keyValuePairs)
55+
dictionary = [NSString: NSString](uniqueKeysWithValues:
56+
(1...10_000).lazy.map(keyValuePair))
5557
#endif
5658
}
5759

5860
#if _runtime(_ObjC)
59-
private func setup_DictionaryKeysContainsCocoa() {
60-
let keyValuePairs = (1...1_000_000).map {
61-
("\($0)" as NSString, "\($0)" as NSString)
62-
}
63-
let nativeDictionary = [NSString: NSString](
64-
uniqueKeysWithValues: keyValuePairs)
65-
dictionary = (NSDictionary(dictionary: nativeDictionary)
66-
as! [NSString: NSString])
61+
private func setupBridgedDictionary() {
62+
setupNativeDictionary()
63+
dictionary = (NSDictionary(dictionary: dictionary) as! [NSString: NSString])
6764
}
6865
#endif
6966

70-
private func teardown_DictionaryKeysContains() {
67+
private func teardownDictionary() {
7168
dictionary = nil
7269
}
7370

@@ -82,4 +79,3 @@ public func run_DictionaryKeysContains(_ N: Int) {
8279
}
8380
#endif
8481
}
85-

0 commit comments

Comments
 (0)