From 2b04ac5e9b8be8bd1cc1263755a55a579f28009e Mon Sep 17 00:00:00 2001 From: Moritz Warning Date: Sat, 20 Jun 2015 09:36:51 +0200 Subject: replace _networks map by vector _networks is usually quite small, using binary search on a vector might be faster comapred to std::map. This is especially true when using uClibc++, which uses a list. --- node/Node.hpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'node/Node.hpp') diff --git a/node/Node.hpp b/node/Node.hpp index 1d9372e4..6ef306eb 100644 --- a/node/Node.hpp +++ b/node/Node.hpp @@ -155,19 +155,21 @@ public: len); } - inline SharedPtr network(uint64_t nwid) + inline SharedPtr network(uint64_t nwid) const { Mutex::Lock _l(_networks_m); - std::map< uint64_t,SharedPtr >::iterator nw(_networks.find(nwid)); - return ((nw == _networks.end()) ? SharedPtr() : nw->second); + std::vector< SharedPtr >::const_iterator iter = std::lower_bound(_networks.begin(), _networks.end(), nwid, NetworkComparator()); + if(iter != _networks.end() && (*iter)->id() == nwid) { + return *iter; + } else { + return SharedPtr(); + } } inline std::vector< SharedPtr > allNetworks() const { Mutex::Lock _l(_networks_m); - std::vector< SharedPtr > nw; - for(std::map< uint64_t,SharedPtr >::const_iterator n(_networks.begin());n!=_networks.end();++n) - nw.push_back(n->second); + std::vector< SharedPtr > nw(_networks); return nw; } @@ -208,6 +210,13 @@ public: #endif private: + // for binary search on _networks + struct NetworkComparator { + bool operator()(const SharedPtr &n,uint64_t nwid) const { + return n->id() < nwid; + } + }; + RuntimeEnvironment _RR; RuntimeEnvironment *RR; @@ -223,7 +232,7 @@ private: //Dictionary _localConfig; // persisted as local.conf //Mutex _localConfig_m; - std::map< uint64_t,SharedPtr > _networks; + std::vector< SharedPtr > _networks; Mutex _networks_m; Mutex _backgroundTasksLock; -- cgit v1.2.3 From 787608b5683eb5df2a8ca0d365438234b5497c60 Mon Sep 17 00:00:00 2001 From: Moritz Warning Date: Sat, 20 Jun 2015 16:32:48 +0200 Subject: use _network function to reduce source code complexity --- node/Node.cpp | 10 +++++----- node/Node.hpp | 17 +++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) (limited to 'node/Node.hpp') diff --git a/node/Node.cpp b/node/Node.cpp index 8e00071f..1dbb6d19 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -311,8 +311,8 @@ ZT1_ResultCode Node::processBackgroundTasks(uint64_t now,volatile uint64_t *next ZT1_ResultCode Node::join(uint64_t nwid) { Mutex::Lock _l(_networks_m); - std::vector< SharedPtr >::const_iterator nwi = std::lower_bound(_networks.begin(), _networks.end(), nwid, NetworkComparator()); - if(nwi == _networks.end() || (*nwi)->id() != nwid) { + SharedPtr nw = _network(nwid); + if(!nw) { _networks.push_back(SharedPtr(new Network(RR,nwid))); std::sort(_networks.begin(),_networks.end()); } @@ -412,10 +412,10 @@ ZT1_PeerList *Node::peers() const ZT1_VirtualNetworkConfig *Node::networkConfig(uint64_t nwid) const { Mutex::Lock _l(_networks_m); - std::vector< SharedPtr >::const_iterator nwi = std::lower_bound(_networks.begin(), _networks.end(), nwid, NetworkComparator()); - if(nwi != _networks.end() && (*nwi)->id() == nwid) { + SharedPtr nw = _network(nwid); + if(nw) { ZT1_VirtualNetworkConfig *nc = (ZT1_VirtualNetworkConfig *)::malloc(sizeof(ZT1_VirtualNetworkConfig)); - (*nwi)->externalConfig(nc); + nw->externalConfig(nc); return nc; } return (ZT1_VirtualNetworkConfig *)0; diff --git a/node/Node.hpp b/node/Node.hpp index 6ef306eb..b0f4ab22 100644 --- a/node/Node.hpp +++ b/node/Node.hpp @@ -158,12 +158,7 @@ public: inline SharedPtr network(uint64_t nwid) const { Mutex::Lock _l(_networks_m); - std::vector< SharedPtr >::const_iterator iter = std::lower_bound(_networks.begin(), _networks.end(), nwid, NetworkComparator()); - if(iter != _networks.end() && (*iter)->id() == nwid) { - return *iter; - } else { - return SharedPtr(); - } + return _network(nwid); } inline std::vector< SharedPtr > allNetworks() const @@ -217,6 +212,16 @@ private: } }; + inline SharedPtr _network(uint64_t nwid) const + { + std::vector< SharedPtr >::const_iterator iter = std::lower_bound(_networks.begin(), _networks.end(), nwid, NetworkComparator()); + if(iter != _networks.end() && (*iter)->id() == nwid) { + return *iter; + } else { + return SharedPtr(); + } + } + RuntimeEnvironment _RR; RuntimeEnvironment *RR; -- cgit v1.2.3