From 9ec2e42e0ee0db37ddcf60d68a598bfa9f80b764 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Sat, 17 Sep 2022 11:57:35 -0700 Subject: [PATCH] Revert "Reduce memory allocations for deduping completions" The optimization takes references to strings which are stored in a vector, and stores those references in a set; but the strings are simultaneously being moved within the vector, which may invalidate those references. It's probably safe if you work through which particular strings are being moved, but as a matter of principle we shouldn't take references to elements of a vector while the vector is being rearranged, absenet a clear improvement on a benchmark. This reverts commit d5561623aab5e6547f258e8165951beae11e94e3. --- src/complete.cpp | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/complete.cpp b/src/complete.cpp index 7f4ae7784..85d3cba2f 100644 --- a/src/complete.cpp +++ b/src/complete.cpp @@ -273,25 +273,12 @@ __attribute__((always_inline)) static inline bool compare_completions_by_tilde( } /// Unique the list of completions, without perturbing their order. -static void dedup_completions_retaining_order(completion_list_t *comps) { - struct ref_hash_t { - size_t operator()(const wcstring &val) const { - return std::hash()(val); - } - }; - - struct ref_equal_t { - bool operator()(const wcstring &lhs, const wcstring &rhs) const { - return lhs == rhs; - } - }; - - std::unordered_set, ref_hash_t, ref_equal_t> seen; +static void unique_completions_retaining_order(completion_list_t *comps) { + std::unordered_set seen; seen.reserve(comps->size()); auto pred = [&seen](const completion_t &c) { // Remove (return true) if insertion fails. - auto r = std::reference_wrapper(c.completion); - bool inserted = seen.insert(r).second; + bool inserted = seen.insert(c.completion).second; return !inserted; }; comps->erase(std::remove_if(comps->begin(), comps->end(), pred), comps->end()); @@ -312,7 +299,7 @@ void completions_sort_and_prioritize(completion_list_t *comps, completion_reques comps->end()); // Deduplicate both sorted and unsorted results. - dedup_completions_retaining_order(comps); + unique_completions_retaining_order(comps); // Sort, provided COMPLETE_DONT_SORT isn't set. // Here we do not pass suppress_exact, so that exact matches appear first.