mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
223 lines
6.3 KiB
Swift
223 lines
6.3 KiB
Swift
//===--- 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<UInt32>()
|
|
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<UInt32> {
|
|
var result = Set<UInt32>(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<UInt32> =
|
|
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:
|