Native implementation of -lengthOfBytesUsingEncoding, plus handling ASCII-subset MacRoman in a few places (#81791)

Fixes rdar://154341146
This commit is contained in:
David Smith
2025-06-27 20:48:10 +00:00
committed by GitHub
parent 7c1dffb1f2
commit 1a56da655f
7 changed files with 137 additions and 1 deletions

View File

@@ -100,6 +100,24 @@ public let benchmarks = [
BenchmarkInfo(name: "NSDictionary.bridged.enumerate",
runFunction: run_BridgedNSDictionaryEnumerate, tags: t,
setUpFunction: setup_bridgedDictionaries),
BenchmarkInfo(name: "NSString.bridged.byteCount.ascii.ascii",
runFunction: run_BridgedNSStringLengthASCII_ASCII, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.byteCount.ascii.utf8",
runFunction: run_BridgedNSStringLengthASCII_UTF8, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.byteCount.ascii.utf16",
runFunction: run_BridgedNSStringLengthASCII_UTF16, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.byteCount.ascii.macroman",
runFunction: run_BridgedNSStringLengthASCII_MacRoman, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.byteCount.utf8.utf8",
runFunction: run_BridgedNSStringLengthUTF8_UTF8, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.byteCount.utf8.utf16",
runFunction: run_BridgedNSStringLengthUTF8_UTF16, tags: ts,
setUpFunction: setup_bridgedStrings),
]
#if _runtime(_ObjC)
@@ -801,6 +819,8 @@ var bridgedDictionaryOfNumbersToNumbers:NSDictionary! = nil
var bridgedArrayMutableCopy:NSMutableArray! = nil
var nsArray:NSArray! = nil
var nsArrayMutableCopy:NSMutableArray! = nil
var bridgedASCIIString:NSString! = nil
var bridgedUTF8String:NSString! = nil
#endif
public func setup_bridgedArrays() {
@@ -822,6 +842,14 @@ public func setup_bridgedDictionaries() {
bridgedDictionaryOfNumbersToNumbers = numDict as NSDictionary
}
public func setup_bridgedStrings() {
#if _runtime(_ObjC)
let str = Array(repeating: "The quick brown fox jumps over the lazy dog.", count: 100).joined()
bridgedASCIIString = str as NSString
let str2 = Array(repeating: "The quick brown fox jumps over the lazy dög.", count: 100).joined()
bridgedUTF8String = str2 as NSString
#endif
}
@inline(never)
public func run_BridgedNSArrayObjectAtIndex(_ n: Int) {
@@ -914,3 +942,40 @@ public func run_RealNSArrayMutableCopyObjectAtIndex(_ n: Int) {
#endif
}
@inline(__always)
fileprivate func run_BridgedNSStringLength(_ asciiBase: Bool, _ enc: UInt, _ n: Int) {
let str = asciiBase ? bridgedASCIIString : bridgedUTF8String
for _ in 0 ..< n * 100 {
blackHole(str!.lengthOfBytes(using: enc))
}
}
@inline(never)
public func run_BridgedNSStringLengthASCII_ASCII(_ n: Int) {
run_BridgedNSStringLength(true, 1 /* NSASCIIStringEncoding */, n)
}
@inline(never)
public func run_BridgedNSStringLengthASCII_UTF8(_ n: Int) {
run_BridgedNSStringLength(true, 4 /* NSUTF8StringEncoding */, n)
}
@inline(never)
public func run_BridgedNSStringLengthASCII_UTF16(_ n: Int) {
run_BridgedNSStringLength(true, 10 /* NSUnicodeStringEncoding */, n)
}
@inline(never)
public func run_BridgedNSStringLengthASCII_MacRoman(_ n: Int) {
run_BridgedNSStringLength(true, 30 /* NSMacOSRomanStringEncoding */, n)
}
@inline(never)
public func run_BridgedNSStringLengthUTF8_UTF8(_ n: Int) {
run_BridgedNSStringLength(false, 4 /* NSUTF8StringEncoding */, n)
}
@inline(never)
public func run_BridgedNSStringLengthUTF8_UTF16(_ n: Int) {
run_BridgedNSStringLength(false, 10 /* NSUnicodeStringEncoding */, n)
}