Skip to content

Commit bf78d4a

Browse files
authored
Merge pull request #28271 from Catfish-Man/mutantmark
Add benchmarks for mutable copies of bridged Swift Strings
2 parents 6db9a69 + 9188dd6 commit bf78d4a

File tree

1 file changed

+93
-1
lines changed

1 file changed

+93
-1
lines changed

benchmark/single-source/NSStringConversion.swift

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import TestsUtils
1717
import Foundation
1818

1919
fileprivate var test:NSString = ""
20+
fileprivate var mutableTest = ""
2021

2122
public let NSStringConversion = [
2223
BenchmarkInfo(name: "NSStringConversion",
@@ -65,7 +66,44 @@ public let NSStringConversion = [
6566
BenchmarkInfo(name: "NSStringConversion.Rebridge.LongUTF8",
6667
runFunction: run_NSStringConversion_longNonASCII_rebridge,
6768
tags: [.validation, .api, .String, .bridging],
68-
setUpFunction: { test = NSString(cString: "Thë qüick bröwn föx jumps over the lazy dög", encoding: String.Encoding.utf8.rawValue)! })]
69+
setUpFunction: { test = NSString(cString: "Thë qüick bröwn föx jumps over the lazy dög", encoding: String.Encoding.utf8.rawValue)! } ),
70+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.UTF8",
71+
runFunction: run_NSStringConversion_nonASCIIMutable,
72+
tags: [.validation, .api, .String, .bridging],
73+
setUpFunction: { mutableTest = "tëst" }),
74+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.Medium",
75+
runFunction: run_NSStringConversion_mediumMutable,
76+
tags: [.validation, .api, .String, .bridging],
77+
setUpFunction: { mutableTest = "aaaaaaaaaaaaaaa" } ),
78+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.Long",
79+
runFunction: run_NSStringConversion_longMutable,
80+
tags: [.validation, .api, .String, .bridging],
81+
setUpFunction: { mutableTest = "The quick brown fox jumps over the lazy dog" } ),
82+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.LongUTF8",
83+
runFunction: run_NSStringConversion_longNonASCIIMutable,
84+
tags: [.validation, .api, .String, .bridging],
85+
setUpFunction: { mutableTest = "Thë qüick bröwn föx jumps over the lazy dög" } ),
86+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.Rebridge",
87+
runFunction: run_NSStringConversion_rebridgeMutable,
88+
tags: [.validation, .api, .String, .bridging],
89+
setUpFunction: { mutableTest = "test" }),
90+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.Rebridge.UTF8",
91+
runFunction: run_NSStringConversion_nonASCII_rebridgeMutable,
92+
tags: [.validation, .api, .String, .bridging],
93+
setUpFunction: { mutableTest = "tëst" }),
94+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.Rebridge.Medium",
95+
runFunction: run_NSStringConversion_medium_rebridgeMutable,
96+
tags: [.validation, .api, .String, .bridging],
97+
setUpFunction: { mutableTest = "aaaaaaaaaaaaaaa" } ),
98+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.Rebridge.Long",
99+
runFunction: run_NSStringConversion_long_rebridgeMutable,
100+
tags: [.validation, .api, .String, .bridging],
101+
setUpFunction: { mutableTest = "The quick brown fox jumps over the lazy dog" } ),
102+
BenchmarkInfo(name: "NSStringConversion.MutableCopy.Rebridge.LongUTF8",
103+
runFunction: run_NSStringConversion_longNonASCII_rebridgeMutable,
104+
tags: [.validation, .api, .String, .bridging],
105+
setUpFunction: { mutableTest = "Thë qüick bröwn föx jumps over the lazy dög" } )
106+
]
69107

70108
public func run_NSStringConversion(_ N: Int) {
71109
let test:NSString = NSString(cString: "test", encoding: String.Encoding.ascii.rawValue)!
@@ -103,6 +141,31 @@ public func run_NSStringConversion_longNonASCII(_ N: Int) {
103141
innerLoop(test, N, 300)
104142
}
105143

144+
fileprivate func innerMutableLoop(_ str: String, _ N: Int, _ scale: Int = 5000) {
145+
for _ in 1...N * scale {
146+
let copy = (str as NSString).mutableCopy() as! NSMutableString
147+
for char in (identity(copy) as String).utf8 {
148+
blackHole(char)
149+
}
150+
}
151+
}
152+
153+
public func run_NSStringConversion_nonASCIIMutable(_ N: Int) {
154+
innerMutableLoop(mutableTest, N, 500)
155+
}
156+
157+
public func run_NSStringConversion_mediumMutable(_ N: Int) {
158+
innerMutableLoop(mutableTest, N, 500)
159+
}
160+
161+
public func run_NSStringConversion_longMutable(_ N: Int) {
162+
innerMutableLoop(mutableTest, N, 250)
163+
}
164+
165+
public func run_NSStringConversion_longNonASCIIMutable(_ N: Int) {
166+
innerMutableLoop(mutableTest, N, 150)
167+
}
168+
106169
fileprivate func innerRebridge(_ str: NSString, _ N: Int, _ scale: Int = 5000) {
107170
for _ in 1...N * scale {
108171
let bridged = identity(str) as String
@@ -135,4 +198,33 @@ public func run_NSStringConversion_longNonASCII_rebridge(_ N: Int) {
135198
innerRebridge(test, N, 300)
136199
}
137200

201+
fileprivate func innerMutableRebridge(_ str: String, _ N: Int, _ scale: Int = 5000) {
202+
for _ in 1...N * scale {
203+
let copy = (str as NSString).mutableCopy() as! NSMutableString
204+
let bridged = identity(copy) as String
205+
blackHole(bridged)
206+
blackHole(bridged as NSString)
207+
}
208+
}
209+
210+
public func run_NSStringConversion_rebridgeMutable(_ N: Int) {
211+
innerMutableRebridge(mutableTest, N, 1000)
212+
}
213+
214+
public func run_NSStringConversion_nonASCII_rebridgeMutable(_ N: Int) {
215+
innerMutableRebridge(mutableTest, N, 500)
216+
}
217+
218+
public func run_NSStringConversion_medium_rebridgeMutable(_ N: Int) {
219+
innerMutableRebridge(mutableTest, N, 500)
220+
}
221+
222+
public func run_NSStringConversion_long_rebridgeMutable(_ N: Int) {
223+
innerMutableRebridge(mutableTest, N, 500)
224+
}
225+
226+
public func run_NSStringConversion_longNonASCII_rebridgeMutable(_ N: Int) {
227+
innerMutableRebridge(mutableTest, N, 300)
228+
}
229+
138230
#endif

0 commit comments

Comments
 (0)