From 975e0f38e6febd2687d5a87dc2266776e84472d2 Mon Sep 17 00:00:00 2001 From: vng Date: Thu, 22 Dec 2011 23:29:43 +0300 Subject: [PATCH] [search] Replace unordered_set by vector - speed improvments. --- search/feature_offset_match.hpp | 21 +++++++++++---------- search/intermediate_result.cpp | 1 + search/intermediate_result.hpp | 4 +++- search/search_query.cpp | 24 ++++++++++++++++++++---- search/search_query.hpp | 2 +- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/search/feature_offset_match.hpp b/search/feature_offset_match.hpp index fce07a8425..c4cf509559 100644 --- a/search/feature_offset_match.hpp +++ b/search/feature_offset_match.hpp @@ -124,21 +124,21 @@ void PrefixMatchInTrie(TrieIterator const & trieRoot, } } -struct OffsetIntersecter +template struct OffsetIntersecter { typedef unordered_map MapType; - unordered_set const * m_pOffsetFilter; + FilterT const & m_filter; MapType m_prevMap; MapType m_map; bool m_bFirstStep; - explicit OffsetIntersecter(unordered_set const * pOffsetFilter) - : m_pOffsetFilter(pOffsetFilter), m_bFirstStep(true) {} + explicit OffsetIntersecter(FilterT const & filter) + : m_filter(filter), m_bFirstStep(true) {} void operator() (uint32_t offset, uint8_t rank) { - if (m_pOffsetFilter && !m_pOffsetFilter->count(offset)) + if (!m_filter(offset)) return; uint16_t prevRankSum = 0; @@ -164,17 +164,17 @@ struct OffsetIntersecter } // namespace search::impl -template +template void MatchFeaturesInTrie(vector > const & tokens, strings::UniString const & prefix, TrieIterator const & trieRoot, strings::UniChar const * commonPrefix, size_t commonPrefixSize, - unordered_set const * pOffsetsFilter, - F & f, + FilterT const & filter, + ToDo & toDo, size_t resultsNeeded) { - impl::OffsetIntersecter intersecter(pOffsetsFilter); + impl::OffsetIntersecter intersecter(filter); // Match tokens. for (size_t i = 0; i < tokens.size(); ++i) @@ -189,6 +189,7 @@ void MatchFeaturesInTrie(vector > const & tokens, if (prefix.size() > 0) { impl::PrefixMatchInTrie(trieRoot, commonPrefix, commonPrefixSize, prefix, intersecter); + intersecter.NextStep(); } @@ -203,7 +204,7 @@ void MatchFeaturesInTrie(vector > const & tokens, } for (ResType::const_iterator it = res.begin(); it != res.end(); ++it) - f(it->first); + toDo(it->first); } diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp index 67718de89f..f244b77539 100644 --- a/search/intermediate_result.cpp +++ b/search/intermediate_result.cpp @@ -2,6 +2,7 @@ #include "../storage/country_info.hpp" +#include "../indexer/feature.hpp" #include "../indexer/feature_utils.hpp" #include "../indexer/mercator.hpp" diff --git a/search/intermediate_result.hpp b/search/intermediate_result.hpp index a868abed69..d44bf42b67 100644 --- a/search/intermediate_result.hpp +++ b/search/intermediate_result.hpp @@ -1,9 +1,11 @@ #pragma once #include "result.hpp" -#include "../indexer/feature.hpp" +#include "../std/shared_ptr.hpp" +class FeatureType; + namespace storage { class CountryInfoGetter; } namespace search diff --git a/search/search_query.cpp b/search/search_query.cpp index dc02e3469e..9d5511bd83 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -3,7 +3,6 @@ #include "feature_offset_match.hpp" #include "lang_keywords_scorer.hpp" #include "latlon_match.hpp" -#include "result.hpp" #include "search_common.hpp" #include "../indexer/feature_covering.hpp" @@ -20,7 +19,6 @@ #include "../base/stl_add.hpp" #include "../std/algorithm.hpp" -#include "../std/vector.hpp" namespace search @@ -102,10 +100,12 @@ void Query::UpdateViewportOffsets() for (size_t i = 0; i < interval.size(); ++i) { - index.ForEachInIntervalAndScale(MakeInsertFunctor(m_offsetsInViewport[mwmId]), + index.ForEachInIntervalAndScale(MakeBackInsertFunctor(m_offsetsInViewport[mwmId]), interval[i].first, interval[i].second, scale); } + + sort(m_offsetsInViewport[mwmId].begin(), m_offsetsInViewport[mwmId].end()); } } } @@ -438,6 +438,21 @@ void Query::SearchFeatures() SearchFeatures(tokens, mwmInfo, langs, true); } +namespace +{ + class FeaturesFilter + { + vector const & m_offsets; + public: + FeaturesFilter(vector const & offsets) : m_offsets(offsets) {} + + bool operator() (uint32_t offset) const + { + return binary_search(m_offsets.begin(), m_offsets.end(), offset); + } + }; +} + void Query::SearchFeatures(vector > const & tokens, vector const & mwmInfo, unordered_set const & langs, @@ -477,7 +492,8 @@ void Query::SearchFeatures(vector > const & tokens, MatchFeaturesInTrie(tokens, m_prefix, *pLangRoot, edge.size() == 1 ? NULL : &edge[1], edge.size() - 1, - &m_offsetsInViewport[mwmId], f, m_results[0].max_size() * 10); + FeaturesFilter(m_offsetsInViewport[mwmId]), f, + m_results[0].max_size() * 10); LOG(LDEBUG, ("Lang:", StringUtf8Multilang::GetLangByCode(static_cast(edge[0])), diff --git a/search/search_query.hpp b/search/search_query.hpp index bddc1952ee..e2759d530b 100644 --- a/search/search_query.hpp +++ b/search/search_query.hpp @@ -90,7 +90,7 @@ private: scoped_ptr m_pKeywordsScorer; bool m_bOffsetsCacheIsValid; - vector > m_offsetsInViewport; + vector > m_offsetsInViewport; class CompareT {