Skip to content

Commit 4db1efa

Browse files
authored
Merge pull request swiftlang#20364 from Catfish-Man/morestringbridgingbenchmarks
Microbenchmarks for Swift -> ObjC string bridging
2 parents c3785e2 + 634e6bc commit 4db1efa

File tree

3 files changed

+409
-0
lines changed

3 files changed

+409
-0
lines changed

benchmark/single-source/ObjectiveCBridgingStubs.swift

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,20 @@ public let ObjectiveCBridgingStubs = [
2727
BenchmarkInfo(name: "ObjectiveCBridgeStubToNSDate2", runFunction: run_ObjectiveCBridgeStubToNSDate, tags: [.validation, .bridging]),
2828
BenchmarkInfo(name: "ObjectiveCBridgeStubToNSString", runFunction: run_ObjectiveCBridgeStubToNSString, tags: [.validation, .bridging]),
2929
BenchmarkInfo(name: "ObjectiveCBridgeStubURLAppendPath2", runFunction: run_ObjectiveCBridgeStubURLAppendPath, tags: [.validation, .bridging]),
30+
BenchmarkInfo(name: "ObjectiveCBridgeStringIsEqual", runFunction: run_ObjectiveCBridgeStringIsEqual, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
31+
BenchmarkInfo(name: "ObjectiveCBridgeStringIsEqual2", runFunction: run_ObjectiveCBridgeStringIsEqual2, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
32+
BenchmarkInfo(name: "ObjectiveCBridgeStringIsEqualAllSwift", runFunction: run_ObjectiveCBridgeStringIsEqualAllSwift, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
33+
BenchmarkInfo(name: "ObjectiveCBridgeStringCompare", runFunction: run_ObjectiveCBridgeStringCompare, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
34+
BenchmarkInfo(name: "ObjectiveCBridgeStringCompare2", runFunction: run_ObjectiveCBridgeStringCompare2, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
35+
BenchmarkInfo(name: "ObjectiveCBridgeStringGetASCIIContents", runFunction: run_ObjectiveCBridgeStringGetASCIIContents, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
36+
BenchmarkInfo(name: "ObjectiveCBridgeStringGetUTF8Contents", runFunction: run_ObjectiveCBridgeStringGetUTF8Contents, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
37+
BenchmarkInfo(name: "ObjectiveCBridgeStringRangeOfString", runFunction: run_ObjectiveCBridgeStringRangeOfString, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
38+
BenchmarkInfo(name: "ObjectiveCBridgeStringHash", runFunction: run_ObjectiveCBridgeStringHash, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
39+
BenchmarkInfo(name: "ObjectiveCBridgeStringUTF8String", runFunction: run_ObjectiveCBridgeStringUTF8String, tags: [.validation, .String, .bridging], setUpFunction: setup_StringBridgeBenchmark),
3040
]
3141

42+
var b:BridgeTester! = nil
43+
3244
#if _runtime(_ObjC)
3345
@inline(never)
3446
func testObjectiveCBridgeStubFromNSString() {
@@ -258,3 +270,127 @@ public func run_ObjectiveCBridgeStubDataAppend(N: Int) {
258270
}
259271
#endif
260272
}
273+
274+
@inline(never)
275+
internal func getStringsToBridge() -> [String] {
276+
let strings1 = ["hello", "the quick brown fox jumps over the lazy dog", "the quick brown fox jumps over the lazy dög"]
277+
return strings1 + strings1.map { $0 + $0 } //mix of literals and non-literals
278+
}
279+
280+
@inline(never)
281+
public func run_ObjectiveCBridgeStringIsEqual(N: Int) {
282+
#if _runtime(_ObjC)
283+
for _ in 0 ..< N {
284+
autoreleasepool {
285+
b.testIsEqualToString()
286+
}
287+
}
288+
#endif
289+
}
290+
291+
@inline(never)
292+
public func run_ObjectiveCBridgeStringIsEqual2(N: Int) {
293+
#if _runtime(_ObjC)
294+
for _ in 0 ..< N {
295+
autoreleasepool {
296+
b.testIsEqualToString2()
297+
}
298+
}
299+
#endif
300+
}
301+
302+
@inline(never)
303+
public func run_ObjectiveCBridgeStringIsEqualAllSwift(N: Int) {
304+
#if _runtime(_ObjC)
305+
for _ in 0 ..< N {
306+
autoreleasepool {
307+
b.testIsEqualToStringAllSwift()
308+
}
309+
}
310+
#endif
311+
}
312+
313+
@inline(never)
314+
public func run_ObjectiveCBridgeStringCompare(N: Int) {
315+
#if _runtime(_ObjC)
316+
for _ in 0 ..< N {
317+
autoreleasepool {
318+
b.testCompare()
319+
}
320+
}
321+
#endif
322+
}
323+
324+
@inline(never)
325+
public func run_ObjectiveCBridgeStringCompare2(N: Int) {
326+
#if _runtime(_ObjC)
327+
for _ in 0 ..< N {
328+
autoreleasepool {
329+
b.testCompare2()
330+
}
331+
}
332+
#endif
333+
}
334+
335+
@inline(never)
336+
public func run_ObjectiveCBridgeStringGetASCIIContents(N: Int) {
337+
#if _runtime(_ObjC)
338+
for _ in 0 ..< N {
339+
autoreleasepool {
340+
b.testGetASCIIContents()
341+
}
342+
}
343+
#endif
344+
}
345+
346+
@inline(never)
347+
public func run_ObjectiveCBridgeStringGetUTF8Contents(N: Int) {
348+
#if _runtime(_ObjC)
349+
for _ in 0 ..< N {
350+
autoreleasepool {
351+
b.testGetUTF8Contents()
352+
}
353+
}
354+
#endif
355+
}
356+
357+
@inline(never)
358+
public func run_ObjectiveCBridgeStringRangeOfString(N: Int) {
359+
#if _runtime(_ObjC)
360+
for _ in 0 ..< N {
361+
autoreleasepool {
362+
b.testRangeOfString()
363+
}
364+
}
365+
#endif
366+
}
367+
368+
@inline(never)
369+
public func run_ObjectiveCBridgeStringHash(N: Int) {
370+
#if _runtime(_ObjC)
371+
for _ in 0 ..< N {
372+
autoreleasepool {
373+
b.testHash()
374+
}
375+
}
376+
#endif
377+
}
378+
379+
@inline(never)
380+
public func run_ObjectiveCBridgeStringUTF8String(N: Int) {
381+
#if _runtime(_ObjC)
382+
for _ in 0 ..< N {
383+
autoreleasepool {
384+
b.testUTF8String()
385+
}
386+
}
387+
#endif
388+
}
389+
390+
@inline(never)
391+
public func setup_StringBridgeBenchmark() {
392+
#if _runtime(_ObjC)
393+
b = BridgeTester()
394+
b.setUpStringTests(getStringsToBridge())
395+
#endif
396+
}

benchmark/utils/ObjectiveCTests/ObjectiveCTests.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ NS_ASSUME_NONNULL_BEGIN
1919
NSArray<NSString *> *myArrayOfStrings;
2020
NSDate *myBeginDate;
2121
NSDate *myEndDate;
22+
NSArray<NSString *> *cornucopiaOfStrings;
23+
NSArray<NSString *> *bridgedStrings;
2224
}
2325

2426
- (id)init;
27+
- (void)setUpStringTests:(NSArray<NSString *> *)bridgedStrings;
2528
- (void)testFromString:(NSString *) str;
2629
- (NSString *)testToString;
2730
- (void)testFromArrayOfStrings:(NSArray<NSString *> *)arr;
@@ -31,6 +34,17 @@ NS_ASSUME_NONNULL_BEGIN
3134
- (NSDate *)endDate;
3235
- (void)useDate:(NSDate *)date;
3336

37+
- (void)testIsEqualToString;
38+
- (void)testIsEqualToString2;
39+
- (void)testIsEqualToStringAllSwift;
40+
- (void)testUTF8String;
41+
- (void)testGetUTF8Contents;
42+
- (void)testGetASCIIContents;
43+
- (void)testRangeOfString;
44+
- (void)testHash;
45+
- (void)testCompare;
46+
- (void)testCompare2;
47+
3448
@end
3549

3650
NS_ASSUME_NONNULL_END

0 commit comments

Comments
 (0)