Skip to content

Commit 2cdcebd

Browse files
authored
Merge pull request #1603 from RobertPieta/indexset_union_performance_enhancement
Improve the performance of IndexSet.union
2 parents c0bb0ce + 1bbdaad commit 2cdcebd

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

Foundation/IndexSet.swift

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

477477
/// Union the `IndexSet` with `other`.
478478
public func union(_ other: IndexSet) -> IndexSet {
479-
// This algorithm is naïve but it works. We could avoid calling insert in some cases.
480-
481-
var result = IndexSet()
482-
for r in self.rangeView {
483-
result.insert(integersIn: r)
479+
var result: IndexSet
480+
var dense: IndexSet
481+
482+
// Prepare to make a copy of the more sparse IndexSet to prefer copy over repeated inserts
483+
if self.rangeView.count > other.rangeView.count {
484+
result = self
485+
dense = other
486+
} else {
487+
result = other
488+
dense = self
484489
}
485-
486-
for r in other.rangeView {
487-
result.insert(integersIn: r)
490+
491+
// Insert each range from the less sparse IndexSet
492+
dense.rangeView.forEach {
493+
result.insert(integersIn: $0)
488494
}
495+
489496
return result
490497
}
491498

0 commit comments

Comments
 (0)