Open
Description
Description
String.range performs about 20 times slower than NSString(string: String).range for the same string
Reproduction
code
import Foundation
var test_string: String? = nil;
var test_string_ns: NSString? = nil;
var len = 1024;
for power in stride(from: 10, to: 29, by: 2) {
len = Int(pow(Double(2), Double(power)));
test_string = String(repeating: "1", count: len) + "zu";
test_string_ns = NSString(string: test_string!);
print("string size: 2^\(power) (\(len))")
var ts = Date().timeIntervalSince1970;
NSString(string: test_string!).range(of: "zu", options: NSString.CompareOptions.caseInsensitive)
print(" NSString(String)", "total seconds:", Date().timeIntervalSince1970-ts)
ts = Date().timeIntervalSince1970;
test_string_ns!.range(of: "zu", options: NSString.CompareOptions.caseInsensitive)
print(" NSString ", "total seconds:", Date().timeIntervalSince1970-ts)
ts = Date().timeIntervalSince1970;
test_string!.range(of: "zu", options: NSString.CompareOptions.caseInsensitive)
print(" String ", "total seconds:", Date().timeIntervalSince1970-ts)
}
result
string size: 2^10 (1024)
NSString(String) total seconds: 2.9087066650390625e-05
NSString total seconds: 1.6689300537109375e-05
String total seconds: 0.0015459060668945312
string size: 2^12 (4096)
NSString(String) total seconds: 7.414817810058594e-05
NSString total seconds: 5.507469177246094e-05
String total seconds: 0.0013251304626464844
string size: 2^14 (16384)
NSString(String) total seconds: 0.0002551078796386719
NSString total seconds: 0.00021004676818847656
String total seconds: 0.0048809051513671875
string size: 2^16 (65536)
NSString(String) total seconds: 0.0009019374847412109
NSString total seconds: 0.0006799697875976562
String total seconds: 0.014341115951538086
string size: 2^18 (262144)
NSString(String) total seconds: 0.0029938220977783203
NSString total seconds: 0.0017380714416503906
String total seconds: 0.036461830139160156
string size: 2^20 (1048576)
NSString(String) total seconds: 0.006340980529785156
NSString total seconds: 0.005095005035400391
String total seconds: 0.12430882453918457
string size: 2^22 (4194304)
NSString(String) total seconds: 0.024969816207885742
NSString total seconds: 0.01906609535217285
String total seconds: 0.4754300117492676
string size: 2^24 (16777216)
NSString(String) total seconds: 0.09792113304138184
NSString total seconds: 0.07473611831665039
String total seconds: 2.0220470428466797
string size: 2^26 (67108864)
NSString(String) total seconds: 0.41455817222595215
NSString total seconds: 0.29911088943481445
String total seconds: 7.661313056945801
string size: 2^28 (268435456)
NSString(String) total seconds: 1.6104252338409424
NSString total seconds: 1.2524471282958984
String total seconds: 31.029043912887573
Expected behavior
String.range is at least as fast as NSString.range
Environment
╰─>$ swiftc --version
swift-driver version: 1.115 Apple Swift version 6.0.2 (swiftlang-6.0.2.1.2 clang-1600.0.26.4)
Target: arm64-apple-macosx14.0
sonoma 14.5
Additional information
No response