another attempt at optimizing piece picker

This commit is contained in:
Arvid Norberg 2011-08-14 23:16:12 +00:00
parent 5e92858360
commit 88441e4fdc
4 changed files with 13 additions and 8 deletions

View File

@ -241,7 +241,8 @@ namespace libtorrent
void pick_pieces(bitfield const& pieces
, std::vector<piece_block>& interesting_blocks, int num_blocks
, int prefer_whole_pieces, void* peer, piece_state_t speed
, int options, std::vector<int> const& suggested_pieces) const;
, int options, std::vector<int> const& suggested_pieces
, int num_peers) const;
// picks blocks from each of the pieces in the piece_list
// vector that is also in the piece bitmask. The blocks

View File

@ -1358,10 +1358,14 @@ namespace libtorrent
void piece_picker::pick_pieces(bitfield const& pieces
, std::vector<piece_block>& interesting_blocks, int num_blocks
, int prefer_whole_pieces, void* peer, piece_state_t speed
, int options, std::vector<int> const& suggested_pieces) const
, int options, std::vector<int> const& suggested_pieces
, int num_peers) const
{
// prevent the number of partial pieces to grow indefinitely
if (m_downloads.size() > 20) options |= prioritize_partials;
// make this scale by the number of peers we have. For large
// scale clients, we would have more peers, and allow a higher
// threshold for the number of partials
if (m_downloads.size() > num_peers * 3 / 2) options |= prioritize_partials;
if (options & ignore_whole_pieces) prefer_whole_pieces = 0;

View File

@ -216,7 +216,7 @@ namespace libtorrent
// then use this mode.
p.pick_pieces(*bits, interesting_pieces
, num_requests, prefer_whole_pieces, c.peer_info_struct()
, state, c.picker_options(), suggested);
, state, c.picker_options(), suggested, t.num_peers());
#ifdef TORRENT_VERBOSE_LOGGING
c.peer_log("*** PIECE_PICKER [ prefer_whole: %d picked: %d ]"

View File

@ -204,7 +204,7 @@ std::vector<piece_block> pick_pieces(boost::shared_ptr<piece_picker> const& p, c
{
std::vector<piece_block> picked;
p->pick_pieces(string2vec(availability), picked, num_blocks, prefer_whole_pieces, peer_struct
, state, options, suggested_pieces);
, state, options, suggested_pieces, 20);
print_pick(picked);
TEST_CHECK(verify_pick(p, picked));
return picked;
@ -693,7 +693,7 @@ int test_main()
picked.clear();
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
, piece_picker::fast, piece_picker::prioritize_partials, empty_vector);
, piece_picker::fast, piece_picker::prioritize_partials, empty_vector, 20);
TEST_CHECK(verify_pick(p, picked, true));
print_pick(picked);
// don't pick both busy pieces, just one
@ -702,14 +702,14 @@ int test_main()
picked.clear();
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
, piece_picker::fast, piece_picker::prioritize_partials
| piece_picker::rarest_first, empty_vector);
| piece_picker::rarest_first, empty_vector, 20);
TEST_CHECK(verify_pick(p, picked, true));
print_pick(picked);
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);
picked.clear();
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
, piece_picker::fast, piece_picker::rarest_first, empty_vector);
, piece_picker::fast, piece_picker::rarest_first, empty_vector, 20);
TEST_CHECK(verify_pick(p, picked, true));
print_pick(picked);
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);