Skip to content

String.range is much slower than NSString.range [macOS m1] #1068

Open
@750

Description

@750

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions