Skip to content

[SR-7749] Poor performance of String.replacingOccurrences(of:with:) in corelibs-foundation #3694

Closed
@swift-ci

Description

@swift-ci
Previous ID SR-7749
Radar rdar://56072687
Original Reporter gmilos (JIRA User)
Type Bug
Status Resolved
Resolution Done
Additional Detail from JIRA
Votes 0
Component/s Foundation
Labels Bug
Assignee @kevints
Priority Medium

md5: a019946d343f3e398647d7c8f94dddec

Issue Description:

The following piece of code:

import Foundation

let repeating = "\"."
let original = String(repeating: repeating, count: 1000000)

let start = Date()
_ = original.replacingOccurrences(of: "\"", with: "")
print("took: \(Date().timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate)")

takes over 20s on Linux (4.1 release, Ubuntu 14.04), in comparison to Darwin version, which takes 0.1s.

The cause is O(n^2) algorithm, or more precisely O(m*n), where m is number of matches, n is the length of the string, used here:

https://github.com/apple/swift-corelibs-foundation/blob/b1647aca7eb01626b6d92da89a9b3ee09d13fd36/Foundation/NSString.swift#L1412-L1415

If we built up a new string afresh, appending segments that don't match, we'd have O(n) algorithm.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions