From 4e8d7d40e78f1fa7ca55b7b107ecab6e19d978e0 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Tue, 7 Jul 2015 16:40:34 +0300 Subject: [PATCH] Optimized memory allocations in read manager --- .../memory_feature_index_tests.cpp | 19 +++++---- drape_frontend/memory_feature_index.cpp | 6 +-- drape_frontend/memory_feature_index.hpp | 12 +++++- drape_frontend/tile_info.cpp | 41 ++++--------------- drape_frontend/tile_info.hpp | 4 +- 5 files changed, 35 insertions(+), 47 deletions(-) diff --git a/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp b/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp index b9f0d71040..132c33bcfa 100644 --- a/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp +++ b/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp @@ -15,10 +15,13 @@ namespace { - void MarkNodesAsReaded(vector & features, const vector & indexes) + void MarkNodesAsReaded(df::TFeaturesInfo & features, vector const & featuresToRead) { - for (size_t i = 0; i < indexes.size(); ++i) - features[indexes[i]].m_isOwner = true; + for (df::FeatureInfo & info : features) + { + if (find(featuresToRead.begin(), featuresToRead.end(), info.m_id) != featuresToRead.end()) + info.m_isOwner = true; + } } // void ResetReadedMark(vector & features) @@ -143,7 +146,7 @@ namespace class TestRoutine : public threads::IRoutine { public: - TestRoutine(vector & features, df::MemoryFeatureIndex &index) + TestRoutine(df::TFeaturesInfo & features, df::MemoryFeatureIndex &index) : m_features(features) , m_index(index) { @@ -151,17 +154,17 @@ namespace virtual void Do() { - vector result; + vector result; m_index.ReadFeaturesRequest(m_features, result); MarkNodesAsReaded(m_features, result); } private: - vector & m_features; + df::TFeaturesInfo & m_features; df::MemoryFeatureIndex & m_index; }; - void GenerateFeatures(vector & features) + void GenerateFeatures(df::TFeaturesInfo & features) { for (int i = 0; i < 10000; ++i) features.push_back(df::FeatureInfo(FeatureID(MwmSet::MwmId(), rand()))); @@ -177,7 +180,7 @@ UNIT_TEST(MemoryFeatureIndex_MT_Test) threads::ThreadPool pool(4, bind(&JoinFinishFinction, _1, ref(cond), ref(counter))); df::MemoryFeatureIndex index; - vector features[TASK_COUNT]; + df::TFeaturesInfo features[TASK_COUNT]; for (int i = 0; i < TASK_COUNT; ++i) { diff --git a/drape_frontend/memory_feature_index.cpp b/drape_frontend/memory_feature_index.cpp index 0ab4328848..7a81b86c44 100644 --- a/drape_frontend/memory_feature_index.cpp +++ b/drape_frontend/memory_feature_index.cpp @@ -3,7 +3,7 @@ namespace df { -void MemoryFeatureIndex::ReadFeaturesRequest(vector & features, vector & indexes) +void MemoryFeatureIndex::ReadFeaturesRequest(TFeaturesInfo & features, vector & featuresToRead) { threads::MutexGuard lock(m_mutex); @@ -13,13 +13,13 @@ void MemoryFeatureIndex::ReadFeaturesRequest(vector & features, vec ASSERT(m_features.find(info.m_id) != m_features.end() || !info.m_isOwner,()); if (!info.m_isOwner && m_features.insert(info.m_id).second) { - indexes.push_back(i); + featuresToRead.push_back(info.m_id); info.m_isOwner = true; } } } -void MemoryFeatureIndex::RemoveFeatures(vector & features) +void MemoryFeatureIndex::RemoveFeatures(TFeaturesInfo & features) { threads::MutexGuard lock(m_mutex); diff --git a/drape_frontend/memory_feature_index.hpp b/drape_frontend/memory_feature_index.hpp index 4382098ad8..056dace7a1 100644 --- a/drape_frontend/memory_feature_index.hpp +++ b/drape_frontend/memory_feature_index.hpp @@ -1,6 +1,8 @@ #pragma once #include "indexer/feature_decl.hpp" + +#include "base/buffer_vector.hpp" #include "base/mutex.hpp" #include "std/set.hpp" @@ -13,6 +15,9 @@ namespace df struct FeatureInfo { + FeatureInfo() + : m_isOwner(false) {} + FeatureInfo(FeatureID const & id) : m_id(id), m_isOwner(false) {} @@ -28,11 +33,14 @@ struct FeatureInfo bool m_isOwner; }; +size_t const AverageFeaturesCount = 2048; +using TFeaturesInfo = buffer_vector; + class MemoryFeatureIndex : private noncopyable { public: - void ReadFeaturesRequest(vector & features, vector & indexes); - void RemoveFeatures(vector & features); + void ReadFeaturesRequest(TFeaturesInfo & features, vector & featuresToRead); + void RemoveFeatures(TFeaturesInfo & features); private: threads::Mutex m_mutex; diff --git a/drape_frontend/tile_info.cpp b/drape_frontend/tile_info.cpp index 1d9ab3c650..9f4f44dc13 100644 --- a/drape_frontend/tile_info.cpp +++ b/drape_frontend/tile_info.cpp @@ -7,39 +7,18 @@ #include "indexer/scales.hpp" #include "base/scope_guard.hpp" +#include "base/logging.hpp" #include "std/bind.hpp" -namespace -{ - -struct IDsAccumulator -{ - IDsAccumulator(vector & ids, vector const & src) - : m_ids(ids) - , m_src(src) - { - } - - void operator()(size_t index) - { - ASSERT_LESS(index, m_src.size(), ()); - m_ids.push_back(m_src[index].m_id); - } - - vector & m_ids; - vector const & m_src; -}; - -} // namespace - namespace df { TileInfo::TileInfo(drape_ptr && context) : m_context(move(context)) , m_isCanceled(false) -{} +{ +} m2::RectD TileInfo::GetGlobalRect() const { @@ -69,14 +48,12 @@ void TileInfo::ReadFeatures(MapDataProvider const & model, ReadFeatureIndex(model); CheckCanceled(); - vector indexes; - RequestFeatures(memIndex, indexes); + vector featuresToRead; + featuresToRead.reserve(AverageFeaturesCount); + RequestFeatures(memIndex, featuresToRead); - if (!indexes.empty()) + if (!featuresToRead.empty()) { - vector featuresToRead; - for_each(indexes.begin(), indexes.end(), IDsAccumulator(featuresToRead, m_featureInfo)); - RuleDrawer drawer(bind(&TileInfo::InitStylist, this, _1 ,_2), make_ref(m_context)); model.ReadFeatures(bind(ref(drawer), _1), featuresToRead); } @@ -108,10 +85,10 @@ bool TileInfo::DoNeedReadIndex() const return m_featureInfo.empty(); } -void TileInfo::RequestFeatures(MemoryFeatureIndex & memIndex, vector & featureIndexes) +void TileInfo::RequestFeatures(MemoryFeatureIndex & memIndex, vector & featuresToRead) { lock_guard lock(m_mutex); - memIndex.ReadFeaturesRequest(m_featureInfo, featureIndexes); + memIndex.ReadFeaturesRequest(m_featureInfo, featuresToRead); } void TileInfo::CheckCanceled() const diff --git a/drape_frontend/tile_info.hpp b/drape_frontend/tile_info.hpp index 8c4b568023..ee3c8b5ac5 100644 --- a/drape_frontend/tile_info.hpp +++ b/drape_frontend/tile_info.hpp @@ -39,7 +39,7 @@ private: void ReadFeatureIndex(MapDataProvider const & model); void ProcessID(FeatureID const & id); void InitStylist(FeatureType const & f, Stylist & s); - void RequestFeatures(MemoryFeatureIndex & memIndex, vector & featureIndexes); + void RequestFeatures(MemoryFeatureIndex & memIndex, vector & featuresToRead); void CheckCanceled() const; bool DoNeedReadIndex() const; @@ -47,7 +47,7 @@ private: private: drape_ptr m_context; - vector m_featureInfo; + TFeaturesInfo m_featureInfo; atomic m_isCanceled; mutex m_mutex;