[swift-dev] String comparison improvements

Itai Ferber iferber at apple.com
Wed Jan 17 16:36:21 CST 2018


Hi Lance (and Michael — I’ll keep the conversation in one thread),

Sounds reasonable. My one concern is that behavior around implicitly 
bridged strings is going to change, in a potentially problematic and 
"magic" way:

```swift
let s1: String = …
let s2: String = …

let mySet = NSMutableSet()
mySet.add(s1)
mySet.add(s2)

// s1 != s2 by Swift ordering rules, but CFStringCompare(s1, s2, …) == 
kCFCompareEqualTo
print(mySet.count) // => 1 ????
```

or alternatively:

```swift
let s1: String = …
let s2: String = …

let mySet = NSMutableSet()
mySet.add(s1)

// s1 == s2 by Swift ordering rules, but CFStringCompare(s1, s2, …) != 
kCFCompareEqualTo
print(mySet.contains(s2)) // => false ????
```

I don’t think there’s much we can do about this, but this is 
something we’re going to have to watch out for — this will be a 
relatively rare and very subtle behavior change.

— Itai

On 17 Jan 2018, at 13:56, Lance Parker wrote:

> Comments inline below
>
>> On Jan 17, 2018, at 1:46 PM, Itai Ferber <iferber at apple.com> wrote:
>>
>> Hi Lance,
>>
>> I read Michael’s emails but I don’t remember at the moment — 
>> what is the new string comparison implementation going to be based 
>> on?
>>
> The new approach uses the lexicographical ordering of NFC-normalized 
> UTF-16 code units. For two known ASCII strings, we just use memcmp.
>> Also, how will this affect bridged strings? If I compare two 
>> NSStrings, I may get a different result than if I compare the same 
>> two strings as bridged through String, correct?
>>
> If I understand correctly, you’re asking what will happen if you 
> have two strings explicitly typed as NSString in swift and you compare 
> them. I believe they’ll still use whatever NSString does for 
> comparison today, so CFStringCompare. For Swift strings backed by a 
> bridged NSString, this new comparison method will be used.
>
> It might make sense for explicit NSStrings in Swift to use the new 
> method as well. What do you think?
>> — Itai
>>
>> On 17 Jan 2018, at 13:19, Lance Parker via swift-dev wrote:
>>
>> Hey Swift-Dev,
>>
>> The swift standard library team  have been working on a new 
>> implementation for comparing Swift strings for Swift 5. Michael 
>> touched on the motivations in the State of String email but I’ll 
>> summarize here:
>>
>> The Swift String comparison implementations on Apple platforms and 
>> Linux differ in results and performance. Apple platforms use 
>> CFStringCompare with no locale, while Linux uses ICU libraries. 
>> Unifying the algorithms that Swift strings use for comparison is 
>> reason alone for doing a new implementation.
>> We've come up with some great common fast paths that speed up 
>> comparisons for a lot of common cases. Our microbenchmarks show up to 
>> a 6.8x increase in performance and there is still some low hanging 
>> fruit in our implementation that would bring further speedups.
>>
>> Bare in mind this is not intended to be a replacement for sorting 
>> strings that will be presented to users, for that developers should 
>> stick to NSLocalizedString APIs.
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-dev 
>> <https://lists.swift.org/mailman/listinfo/swift-dev>


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20180117/2eff6e0f/attachment.html>


More information about the swift-dev mailing list