forked from premiere/premiere-libtorrent
improve routing_table::depth() performance
This commit is contained in:
parent
64f6a35126
commit
8f2683fe5d
|
@ -40,7 +40,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
#include <boost/array.hpp>
|
#include <boost/array.hpp>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <list>
|
|
||||||
|
|
||||||
#include <libtorrent/kademlia/logging.hpp>
|
#include <libtorrent/kademlia/logging.hpp>
|
||||||
|
|
||||||
|
@ -171,7 +170,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
typedef std::list<routing_table_node> table_t;
|
typedef std::vector<routing_table_node> table_t;
|
||||||
|
|
||||||
table_t::iterator find_bucket(node_id const& id);
|
table_t::iterator find_bucket(node_id const& id);
|
||||||
|
|
||||||
|
@ -197,6 +196,10 @@ private:
|
||||||
|
|
||||||
node_id m_id; // our own node id
|
node_id m_id; // our own node id
|
||||||
|
|
||||||
|
// the last seen depth (i.e. levels in the routing table)
|
||||||
|
// it's mutable because it's updated by depth(), which is const
|
||||||
|
mutable int m_depth;
|
||||||
|
|
||||||
// the last time need_bootstrap() returned true
|
// the last time need_bootstrap() returned true
|
||||||
mutable ptime m_last_bootstrap;
|
mutable ptime m_last_bootstrap;
|
||||||
|
|
||||||
|
|
|
@ -60,10 +60,12 @@ routing_table::routing_table(node_id const& id, int bucket_size
|
||||||
: m_bucket_size(bucket_size)
|
: m_bucket_size(bucket_size)
|
||||||
, m_settings(settings)
|
, m_settings(settings)
|
||||||
, m_id(id)
|
, m_id(id)
|
||||||
|
, m_depth(0)
|
||||||
, m_last_bootstrap(min_time())
|
, m_last_bootstrap(min_time())
|
||||||
, m_last_refresh(min_time())
|
, m_last_refresh(min_time())
|
||||||
, m_last_self_refresh(min_time())
|
, m_last_self_refresh(min_time())
|
||||||
{
|
{
|
||||||
|
m_buckets.reserve(30);
|
||||||
}
|
}
|
||||||
|
|
||||||
int routing_table::bucket_limit(int bucket) const
|
int routing_table::bucket_limit(int bucket) const
|
||||||
|
@ -128,17 +130,26 @@ size_type routing_table::num_global_nodes() const
|
||||||
|
|
||||||
int routing_table::depth() const
|
int routing_table::depth() const
|
||||||
{
|
{
|
||||||
// TODO: 3 cache the depth!
|
if (m_depth >= m_buckets.size())
|
||||||
int deepest_bucket = 0;
|
m_depth = m_buckets.size() - 1;
|
||||||
for (table_t::const_iterator i = m_buckets.begin()
|
|
||||||
, end(m_buckets.end()); i != end; ++i)
|
if (m_depth < 0) return m_depth;
|
||||||
|
|
||||||
|
// maybe the table is deeper now?
|
||||||
|
while (m_depth < int(m_buckets.size())-1
|
||||||
|
&& m_buckets[m_depth+1].live_nodes.size() >= m_bucket_size / 2)
|
||||||
{
|
{
|
||||||
if (i->live_nodes.size() < m_bucket_size / 2)
|
++m_depth;
|
||||||
break;
|
|
||||||
// this bucket is full
|
|
||||||
++deepest_bucket;
|
|
||||||
}
|
}
|
||||||
return deepest_bucket;
|
|
||||||
|
// maybe the table is more shallow now?
|
||||||
|
while (m_depth > 0
|
||||||
|
&& m_buckets[m_depth-1].live_nodes.size() < m_bucket_size / 2)
|
||||||
|
{
|
||||||
|
--m_depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined TORRENT_DHT_VERBOSE_LOGGING || defined TORRENT_DEBUG) && TORRENT_USE_IOSTREAM
|
#if (defined TORRENT_DHT_VERBOSE_LOGGING || defined TORRENT_DEBUG) && TORRENT_USE_IOSTREAM
|
||||||
|
|
Loading…
Reference in New Issue