1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2024-12-23 16:24:02 +00:00

perf: reduce copying in enforceSwarmPeerLimit() (#5731)

* reduce copying in `enforceSwarmPeerLimit()`

* clearer comparator naming
This commit is contained in:
tearfur 2023-07-05 23:10:04 +08:00 committed by GitHub
parent 2a9c30a616
commit 6482d78852
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2054,7 +2054,12 @@ constexpr struct
{
return compare(a, b) < 0;
}
} ComparePeerByActivity{};
} ComparePeerByMostActive{};
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)
{
@ -2085,15 +2090,21 @@ void closeBadPeers(tr_swarm* s, time_t const now_sec)
void enforceSwarmPeerLimit(tr_swarm* swarm, size_t max)
{
// do we have too many peers?
if (auto const n = swarm->peerCount(); n <= max)
auto const n = swarm->peerCount();
if (n <= max)
{
return;
}
// close all but the `max` most active
auto peers = swarm->peers;
std::partial_sort(std::begin(peers), std::begin(peers) + max, std::end(peers), ComparePeerByActivity);
std::for_each(std::begin(peers) + max, std::end(peers), closePeer);
auto peers = std::vector<tr_peerMsgs*>{ n - max };
std::partial_sort_copy(
std::begin(swarm->peers),
std::end(swarm->peers),
std::begin(peers),
std::end(peers),
ComparePeerByLeastActive);
std::for_each(std::begin(peers), std::end(peers), closePeer);
}
void enforceSessionPeerLimit(tr_session* session)
@ -2116,7 +2127,7 @@ void enforceSessionPeerLimit(tr_session* session)
TR_ASSERT(tr_peerMsgs::size() == std::size(peers));
if (std::size(peers) > max)
{
std::partial_sort(std::begin(peers), std::begin(peers) + max, std::end(peers), ComparePeerByActivity);
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);
}
}