Skip to content

Add benchmarks for lengthOfBytes(using:) and maximumLengthOfBytes(using:) #82248

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 126 additions & 2 deletions benchmark/single-source/ObjectiveCBridging.swift
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,42 @@ 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),
BenchmarkInfo(name: "NSString.bridged.maxByteCount.ascii.ascii",
runFunction: run_BridgedNSStringMaxLengthASCII_ASCII, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.maxByteCount.ascii.utf8",
runFunction: run_BridgedNSStringMaxLengthASCII_UTF8, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.maxByteCount.ascii.utf16",
runFunction: run_BridgedNSStringMaxLengthASCII_UTF16, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.maxByteCount.ascii.macroman",
runFunction: run_BridgedNSStringMaxLengthASCII_MacRoman, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.maxByteCount.utf8.utf8",
runFunction: run_BridgedNSStringMaxLengthUTF8_UTF8, tags: ts,
setUpFunction: setup_bridgedStrings),
BenchmarkInfo(name: "NSString.bridged.maxByteCount.utf8.utf16",
runFunction: run_BridgedNSStringMaxLengthUTF8_UTF16, tags: ts,
setUpFunction: setup_bridgedStrings),
]

#if _runtime(_ObjC)
Expand Down Expand Up @@ -801,6 +837,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() {
Expand All @@ -822,6 +860,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) {
Expand Down Expand Up @@ -855,7 +901,7 @@ public func run_BridgedNSDictionaryEnumerate(_ n: Int) {
public func run_BridgedNSArrayBufferAccess(_ n: Int) {
#if _runtime(_ObjC)
for _ in 0 ..< n {
for i in 0..<1000 {
for _ in 0..<1000 {
let tmp = nsArray as! [NSObject]
blackHole(tmp)
blackHole(tmp.withContiguousStorageIfAvailable {
Expand All @@ -872,7 +918,7 @@ public func run_BridgedNSArrayRepeatedBufferAccess(_ n: Int) {
for _ in 0 ..< n {
let tmp = nsArray as! [NSObject]
blackHole(tmp)
for i in 0..<1000 {
for _ in 0..<1000 {
blackHole(tmp.withContiguousStorageIfAvailable {
$0[0]
})
Expand Down Expand Up @@ -914,3 +960,81 @@ 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)
}

@inline(__always)
fileprivate func run_BridgedNSStringMaxLength(_ asciiBase: Bool, _ enc: UInt, _ n: Int) {
let str = asciiBase ? bridgedASCIIString! : bridgedUTF8String!
for _ in 0 ..< n * 100 {
for i in 0..<100 {
blackHole(str.maximumLengthOfBytes(using: enc))
}
}
}

@inline(never)
public func run_BridgedNSStringMaxLengthASCII_ASCII(_ n: Int) {
run_BridgedNSStringMaxLength(true, 1 /* NSASCIIStringEncoding */, n)
}

@inline(never)
public func run_BridgedNSStringMaxLengthASCII_UTF8(_ n: Int) {
run_BridgedNSStringMaxLength(true, 4 /* NSUTF8StringEncoding */, n)
}

@inline(never)
public func run_BridgedNSStringMaxLengthASCII_UTF16(_ n: Int) {
run_BridgedNSStringMaxLength(true, 10 /* NSUnicodeStringEncoding */, n)
}

@inline(never)
public func run_BridgedNSStringMaxLengthASCII_MacRoman(_ n: Int) {
run_BridgedNSStringMaxLength(true, 30 /* NSMacOSRomanStringEncoding */, n)
}

@inline(never)
public func run_BridgedNSStringMaxLengthUTF8_UTF8(_ n: Int) {
run_BridgedNSStringMaxLength(false, 4 /* NSUTF8StringEncoding */, n)
}

@inline(never)
public func run_BridgedNSStringMaxLengthUTF8_UTF16(_ n: Int) {
run_BridgedNSStringMaxLength(false, 10 /* NSUnicodeStringEncoding */, n)
}