perf: reuse the vector in receonnectPulse(). (#5788)

This commit is contained in:
Charles Kerr 2023-07-14 17:46:10 -05:00 committed by GitHub
parent ff6617467e
commit 32af004248
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 12 deletions

View File

@ -1788,7 +1788,7 @@ auto constexpr MaxUploadIdleSecs = time_t{ 60 * 5 };
return false;
}
void closePeer(tr_peer* peer)
void close_peer(tr_peer* peer)
{
TR_ASSERT(peer != nullptr);
tr_logAddTraceSwarm(peer->swarm, fmt::format("removing bad peer {}", peer->display_name()));
@ -1818,29 +1818,31 @@ constexpr auto ComparePeerByLeastActive = [](tr_peer const* a, tr_peer const* b)
return ComparePeerByMostActive(b, a);
};
[[nodiscard]] auto getPeersToClose(tr_swarm const* const swarm, time_t const now_sec)
using bad_peers_t = small::vector<tr_peer*, 512U>;
bad_peers_t& get_peers_to_close(tr_swarm const* const swarm, time_t const now_sec, bad_peers_t& bad_peers_buf)
{
auto const& peers = swarm->peers;
auto const peer_count = std::size(peers);
auto peers_to_close = std::vector<tr_peer*>{};
peers_to_close.reserve(peer_count);
bad_peers_buf.clear();
bad_peers_buf.reserve(peer_count);
for (auto* peer : swarm->peers)
{
if (shouldPeerBeClosed(swarm, peer, peer_count, now_sec))
{
peers_to_close.push_back(peer);
bad_peers_buf.emplace_back(peer);
}
}
return peers_to_close;
return bad_peers_buf;
}
void closeBadPeers(tr_swarm* s, time_t const now_sec)
void close_bad_peers(tr_swarm* s, time_t const now_sec, bad_peers_t& bad_peers_buf)
{
for (auto* peer : getPeersToClose(s, now_sec))
for (auto* peer : get_peers_to_close(s, now_sec, bad_peers_buf))
{
closePeer(peer);
close_peer(peer);
}
}
@ -1861,7 +1863,7 @@ void enforceSwarmPeerLimit(tr_swarm* swarm, size_t max)
std::begin(peers),
std::end(peers),
ComparePeerByLeastActive);
std::for_each(std::begin(peers), std::end(peers), closePeer);
std::for_each(std::begin(peers), std::end(peers), close_peer);
}
void enforceSessionPeerLimit(tr_session* session)
@ -1885,7 +1887,7 @@ void enforceSessionPeerLimit(tr_session* session)
if (std::size(peers) > max)
{
std::partial_sort(std::begin(peers), std::begin(peers) + max, std::end(peers), ComparePeerByMostActive);
std::for_each(std::begin(peers) + max, std::end(peers), closePeer);
std::for_each(std::begin(peers) + max, std::end(peers), close_peer);
}
}
} // namespace disconnect_helpers
@ -1899,6 +1901,7 @@ void tr_peerMgr::reconnectPulse()
auto const now_sec = tr_time();
// remove crappy peers
auto bad_peers_buf = bad_peers_t{};
for (auto* const tor : session->torrents())
{
auto* const swarm = tor->swarm;
@ -1909,7 +1912,7 @@ void tr_peerMgr::reconnectPulse()
}
else
{
closeBadPeers(swarm, now_sec);
close_bad_peers(swarm, now_sec, bad_peers_buf);
}
}