From 17ab354a5ce51b452dcce166de3fc19fc4d23b83 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Mon, 30 Aug 2021 08:15:20 +0000 Subject: As doSeek is called alot more frequent than doUnpack just use locking of the heap in unpack. In addition to adjusting the priority Q also update the distance_threshold with a relaxed store to an atomic variable. On read the distance threshold can be read cheaply with a relaxed load. --- .../searchlib/queryeval/nearest_neighbor_distance_heap.h | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'searchlib/src') diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h index b7bdffd31c1..3db3b1e0ae8 100644 --- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h +++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h @@ -2,9 +2,10 @@ #pragma once +#include #include #include -#include +#include namespace search::queryeval { @@ -15,7 +16,7 @@ class NearestNeighborDistanceHeap { private: std::mutex _lock; size_t _size; - double _distance_threshold; + std::atomic _distance_threshold; vespalib::PriorityQueue> _priQ; public: explicit NearestNeighborDistanceHeap(size_t maxSize) @@ -25,14 +26,10 @@ public: _priQ.reserve(maxSize); } void set_distance_threshold(double distance_threshold) { - _distance_threshold = distance_threshold; + _distance_threshold.store(distance_threshold, std::memory_order_relaxed); } double distanceLimit() { - std::lock_guard guard(_lock); - if (_priQ.size() < _size) { - return _distance_threshold; - } - return _priQ.front(); + return _distance_threshold.load(std::memory_order_relaxed); } void used(double distance) { std::lock_guard guard(_lock); @@ -41,6 +38,7 @@ public: } else if (distance < _priQ.front()) { _priQ.front() = distance; _priQ.adjust(); + _distance_threshold.store(_priQ.front(), std::memory_order_relaxed); } } }; -- cgit v1.2.3