Skip to content

Commit 5d164ee

Browse files
Robert PietaRobert Widmann
Robert Pieta
authored and
Robert Widmann
committed
IndexSet.union performance improvement
1 parent ba854b4 commit 5d164ee

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

Darwin/Foundation-swiftoverlay/IndexSet.swift

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -442,16 +442,23 @@ public struct IndexSet : ReferenceConvertible, Equatable, BidirectionalCollectio
442442

443443
/// Union the `IndexSet` with `other`.
444444
public func union(_ other: IndexSet) -> IndexSet {
445-
// This algorithm is naïve but it works. We could avoid calling insert in some cases.
446-
447-
var result = IndexSet()
448-
for r in self.rangeView {
449-
result.insert(integersIn: r)
445+
var result: IndexSet
446+
var dense: IndexSet
447+
448+
// Prepare to make a copy of the more sparse IndexSet to prefer copy over repeated inserts
449+
if self.rangeView.count > other.rangeView.count {
450+
result = self
451+
dense = other
452+
} else {
453+
result = other
454+
dense = self
450455
}
451-
452-
for r in other.rangeView {
453-
result.insert(integersIn: r)
456+
457+
// Insert each range from the less sparse IndexSet
458+
dense.rangeView.forEach {
459+
result.insert(integersIn: $0)
454460
}
461+
455462
return result
456463
}
457464

0 commit comments

Comments
 (0)