Blog

A Quick Tip For String Performance

In this new post series we’ll show highlights of Swift Talk, our subscription video series. Today, we’ll show a very nice trick by Ole Begemann to increase String processing performance.

In Swift Talk 79, we try to improve CSV string parsing performance by measuring time and comparing the performance of various techniques. To write a performance test, we wrap the parsing of the loaded string in an XCTest measure block:

func testPerformance() {
    let bundle = Bundle(for: ParseCSVTests.self)
    let url = bundle.url(forResource: "small", withExtension: "txt")!
    let data = try! Data(contentsOf: url)
    let string = String(data: data, encoding: .isoLatin1)!

    measure {
        _ = parse(lines: string)
    }
}

The change is a rather obscure tip we got from Ole:

let string = String(data: data, encoding: .isoLatin1)! + ""

When we append an empty string to the test string, we get a performance improvement of 18 percent:

The reason for the performance gain: a string can be backed by a Swift String or an NSString. By appending an empty string, we force it to be backed by a Swift String, with which our algorithm works much faster.

In the remainder of the episode, we also show a technique suggested by Matt Gallagher from Cocoa with Love, and increase performance by another 83%. The episode and transcript are available for subscribers, and are part of the Swift, The Language collection.

Stay up-to-date with our newsletter or follow us on Twitter.

Back to the Blog

recent posts