//===--- CharacterProperties.swift ----------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// % # Ignore the following warning. This _is_ the correct file to edit. //////////////////////////////////////////////////////////////////////////////// // WARNING: This file is manually generated from .gyb template and should not // be directly modified. Instead, make changes to CharacterProperties.swift.gyb // and run scripts/generate_harness/generate_harness.py to regenerate this file. //////////////////////////////////////////////////////////////////////////////// import TestsUtils import Foundation public let benchmarks = [ BenchmarkInfo( name: "CharacterPropertiesFetch", runFunction: run_CharacterPropertiesFetch, tags: [.validation, .api, .String], setUpFunction: { blackHole(workload) }, legacyFactor: 10), BenchmarkInfo( name: "CharacterPropertiesStashed", runFunction: run_CharacterPropertiesStashed, tags: [.validation, .api, .String], setUpFunction: { setupStash() }, legacyFactor: 10), BenchmarkInfo( name: "CharacterPropertiesStashedMemo", runFunction: run_CharacterPropertiesStashedMemo, tags: [.validation, .api, .String], setUpFunction: { setupMemo() }, legacyFactor: 10), BenchmarkInfo( name: "CharacterPropertiesPrecomputed", runFunction: run_CharacterPropertiesPrecomputed, tags: [.validation, .api, .String], setUpFunction: { setupPrecomputed() }, legacyFactor: 10), ] extension Character { var firstScalar: UnicodeScalar { return unicodeScalars.first! } } % Properties = [ ( "Alphanumeric", "alphanumerics"), % ( "Capitalized", "capitalizedLetters"), % ( "Control", "controlCharacters"), % ( "Decimal", "decimalDigits"), % ( "Letter", "letters"), % ( "Lowercase", "lowercaseLetters"), % ( "Uppercase", "uppercaseLetters"), % ( "Newline", "newlines"), % ( "Whitespace", "whitespaces"), % ( "Punctuation", "punctuationCharacters") % ] // Fetch the CharacterSet for every call % for Property, Set in Properties: func is${Property}(_ c: Character) -> Bool { return CharacterSet.${Set}.contains(c.firstScalar) } % end // Stash the set % for Property, Set in Properties: let ${Set} = CharacterSet.${Set} func is${Property}Stashed(_ c: Character) -> Bool { return ${Set}.contains(c.firstScalar) } % end func setupStash() { blackHole(workload) % for Property, Set in Properties: blackHole(${Set}) % end } // Memoize the stashed set % for Property, Set in Properties: var ${Set}Memo = Set() func is${Property}StashedMemo(_ c: Character) -> Bool { let scalar = c.firstScalar if ${Set}Memo.contains(scalar.value) { return true } if ${Set}.contains(scalar) { ${Set}Memo.insert(scalar.value) return true } return false } % end func setupMemo() { blackHole(workload) % for Property, Set in Properties: blackHole(${Set}Memo) % end } // Precompute whole scalar set func precompute(_ charSet: CharacterSet, capacity: Int) -> Set { var result = Set(minimumCapacity: capacity) for plane in 0...0x10 { guard charSet.hasMember(inPlane: UInt8(plane)) else { continue } let offset = plane &* 0x1_0000 for codePoint in 0...0xFFFF { guard let scalar = UnicodeScalar(codePoint &+ offset) else { continue } if charSet.contains(scalar) { result.insert(scalar.value) } } } return result } %{ #// Reduce wide memory range. Capacities from `print("${Set}:…` below. precomputed_capacity = dict( controlCharacters=24951, alphanumerics=122647, lowercaseLetters=2063, punctuationCharacters=770, whitespaces=19, letters=121145, uppercaseLetters=1733, decimalDigits=590, newlines=7, capitalizedLetters=31 ) }% % for Property, Set in Properties: var ${Set}Precomputed: Set = precompute(${Set}, capacity: ${precomputed_capacity[Set]}) func is${Property}Precomputed(_ c: Character) -> Bool { return ${Set}Precomputed.contains(c.firstScalar.value) } % end func setupPrecomputed() { blackHole(workload) % for Property, Set in Properties: blackHole(${Set}Precomputed) %#// print("${Set}: \(${Set}Precomputed.count)") % end } // Compute on the fly // // TODO: If UnicodeScalars ever exposes category, etc., implement the others! func isNewlineComputed(_ c: Character) -> Bool { switch c.firstScalar.value { case 0x000A...0x000D: return true case 0x0085: return true case 0x2028...0x2029: return true default: return false } } let workload = """ the quick brown 🦊 jumped over the lazy 🐢. Π² Ρ‡Π°Ρ‰Π°Ρ… юга ΠΆΠΈΠ»-Π±Ρ‹Π» цитрус? Π΄Π°, Π½ΠΎ Ρ„Π°Π»ΡŒΡˆΠΈΠ²Ρ‹ΠΉ экзСмпляр π“€€π“€€π““π“²π“ƒ”π“ƒ—π“ƒ€π“ƒπ“ƒ‚π“ƒƒπ“†Œπ“†π“†Žπ“†π“†π“†‘π“†’π“†²π“Ώ πŸκƒ•θΊβ€ΎβˆΎπŸ“¦βΊ¨ πŸ‘πŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘§πŸ‘¨β€πŸ‘¨β€πŸ‘¦β€πŸ‘¦πŸ‡ΊπŸ‡ΈπŸ‡¨πŸ‡¦πŸ‡²πŸ‡½πŸ‘πŸ»πŸ‘πŸΌπŸ‘πŸ½πŸ‘πŸΎπŸ‘πŸΏ Lorem ipsum something something something... """ @inline(never) public func run_CharacterPropertiesFetch(_ n: Int) { for _ in 1...n { for c in workload { % for Property, Set in Properties: blackHole(is${Property}(c)) % end } } } @inline(never) public func run_CharacterPropertiesStashed(_ n: Int) { for _ in 1...n { for c in workload { % for Property, Set in Properties: blackHole(is${Property}Stashed(c)) % end } } } @inline(never) public func run_CharacterPropertiesStashedMemo(_ n: Int) { for _ in 1...n { for c in workload { % for Property, Set in Properties: blackHole(is${Property}StashedMemo(c)) % end } } } @inline(never) public func run_CharacterPropertiesPrecomputed(_ n: Int) { for _ in 1...n { for c in workload { % for Property, Set in Properties: blackHole(is${Property}Precomputed(c)) % end } } } // TODO: run_CharacterPropertiesComputed // ${'Local Variables'}: // eval: (read-only-mode 1) // End: