mirror of https://github.com/aria2/aria2
2009-03-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Refactored RarestPieceSelector to reduce CPU load, especially for addPieceStats. * src/RarestPieceSelector.cc * src/RarestPieceSelector.hpull/1/head
parent
3644682511
commit
662a90ce9b
|
@ -1,3 +1,10 @@
|
||||||
|
2009-03-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
|
Refactored RarestPieceSelector to reduce CPU load, especially for
|
||||||
|
addPieceStats.
|
||||||
|
* src/RarestPieceSelector.cc
|
||||||
|
* src/RarestPieceSelector.h
|
||||||
|
|
||||||
2009-03-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2009-03-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Refactored getMissingIndexRandomly, getFirstMissingIndex,
|
Refactored getMissingIndexRandomly, getFirstMissingIndex,
|
||||||
|
|
|
@ -109,7 +109,7 @@ RarestPieceSelector::RarestPieceSelector(size_t pieceNum, bool randomShuffle):
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
size_t order = 0;
|
size_t order = 0;
|
||||||
for(std::deque<SharedHandle<PieceStat> >::iterator i = _sortedPieceStats.begin();
|
for(std::vector<SharedHandle<PieceStat> >::iterator i = _sortedPieceStats.begin();
|
||||||
i != _sortedPieceStats.end(); ++i) {
|
i != _sortedPieceStats.end(); ++i) {
|
||||||
(*i)->setOrder(order++);
|
(*i)->setOrder(order++);
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ bool RarestPieceSelector::select
|
||||||
(size_t& index,
|
(size_t& index,
|
||||||
const std::deque<size_t>& candidateIndexes) const
|
const std::deque<size_t>& candidateIndexes) const
|
||||||
{
|
{
|
||||||
std::deque<SharedHandle<PieceStat> >::const_iterator i =
|
std::vector<SharedHandle<PieceStat> >::const_iterator i =
|
||||||
std::find_if(_sortedPieceStats.begin(), _sortedPieceStats.end(),
|
std::find_if(_sortedPieceStats.begin(), _sortedPieceStats.end(),
|
||||||
FindRarestPiece(candidateIndexes));
|
FindRarestPiece(candidateIndexes));
|
||||||
if(i == _sortedPieceStats.end()) {
|
if(i == _sortedPieceStats.end()) {
|
||||||
|
@ -201,22 +201,19 @@ void RarestPieceSelector::updatePieceStats(const unsigned char* newBitfield,
|
||||||
void RarestPieceSelector::addPieceStats(size_t index)
|
void RarestPieceSelector::addPieceStats(size_t index)
|
||||||
{
|
{
|
||||||
SharedHandle<PieceStat> pieceStat(_pieceStats[index]);
|
SharedHandle<PieceStat> pieceStat(_pieceStats[index]);
|
||||||
{
|
std::vector<SharedHandle<PieceStat> >::iterator cur =
|
||||||
std::deque<SharedHandle<PieceStat> >::iterator cur =
|
|
||||||
std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
|
|
||||||
pieceStat);
|
|
||||||
_sortedPieceStats.erase(cur);
|
|
||||||
}
|
|
||||||
pieceStat->addCount();
|
|
||||||
|
|
||||||
std::deque<SharedHandle<PieceStat> >::iterator to =
|
|
||||||
std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
|
std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
|
||||||
pieceStat);
|
pieceStat);
|
||||||
|
|
||||||
_sortedPieceStats.insert(to, pieceStat);
|
pieceStat->addCount();
|
||||||
|
|
||||||
|
std::vector<SharedHandle<PieceStat> >::iterator to =
|
||||||
|
std::upper_bound(cur+1, _sortedPieceStats.end(), pieceStat);
|
||||||
|
|
||||||
|
std::rotate(cur, cur+1, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >&
|
const std::vector<SharedHandle<PieceStat> >&
|
||||||
RarestPieceSelector::getSortedPieceStats() const
|
RarestPieceSelector::getSortedPieceStats() const
|
||||||
{
|
{
|
||||||
return _sortedPieceStats;
|
return _sortedPieceStats;
|
||||||
|
|
|
@ -37,6 +37,8 @@
|
||||||
|
|
||||||
#include "PieceSelector.h"
|
#include "PieceSelector.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class PieceStat {
|
class PieceStat {
|
||||||
|
@ -60,9 +62,9 @@ public:
|
||||||
|
|
||||||
class RarestPieceSelector:public PieceSelector {
|
class RarestPieceSelector:public PieceSelector {
|
||||||
private:
|
private:
|
||||||
std::deque<SharedHandle<PieceStat> > _pieceStats;
|
std::vector<SharedHandle<PieceStat> > _pieceStats;
|
||||||
|
|
||||||
std::deque<SharedHandle<PieceStat> > _sortedPieceStats;
|
std::vector<SharedHandle<PieceStat> > _sortedPieceStats;
|
||||||
public:
|
public:
|
||||||
RarestPieceSelector(size_t pieceNum, bool randomShuffle);
|
RarestPieceSelector(size_t pieceNum, bool randomShuffle);
|
||||||
|
|
||||||
|
@ -81,7 +83,7 @@ public:
|
||||||
size_t newBitfieldLength,
|
size_t newBitfieldLength,
|
||||||
const unsigned char* oldBitfield);
|
const unsigned char* oldBitfield);
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& getSortedPieceStats() const;
|
const std::vector<SharedHandle<PieceStat> >& getSortedPieceStats() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
#include "RarestPieceSelector.h"
|
#include "RarestPieceSelector.h"
|
||||||
#include "Exception.h"
|
|
||||||
#include "Util.h"
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include <cppunit/extensions/HelperMacros.h>
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "Util.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class RarestPieceSelectorTest:public CppUnit::TestFixture {
|
class RarestPieceSelectorTest:public CppUnit::TestFixture {
|
||||||
|
@ -37,7 +40,7 @@ void RarestPieceSelectorTest::testAddPieceStats_index()
|
||||||
size_t indexes[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 1 };
|
size_t indexes[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 1 };
|
||||||
size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
|
size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
const std::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
||||||
|
|
||||||
for(size_t i = 0; i < 10; ++i) {
|
for(size_t i = 0; i < 10; ++i) {
|
||||||
|
@ -52,7 +55,7 @@ void RarestPieceSelectorTest::testAddPieceStats_index()
|
||||||
size_t indexes[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 1 };
|
size_t indexes[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 1 };
|
||||||
size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
|
size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
const std::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
||||||
|
|
||||||
for(size_t i = 0; i < 10; ++i) {
|
for(size_t i = 0; i < 10; ++i) {
|
||||||
CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
|
CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
|
||||||
|
@ -69,7 +72,7 @@ void RarestPieceSelectorTest::testAddPieceStats_index()
|
||||||
size_t indexes[] = { 2, 4, 5, 6, 7, 8, 0, 9, 1, 3 };
|
size_t indexes[] = { 2, 4, 5, 6, 7, 8, 0, 9, 1, 3 };
|
||||||
size_t counts[] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2 };
|
size_t counts[] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2 };
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
const std::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
||||||
|
|
||||||
for(size_t i = 0; i < 10; ++i) {
|
for(size_t i = 0; i < 10; ++i) {
|
||||||
CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
|
CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
|
||||||
|
@ -88,7 +91,7 @@ void RarestPieceSelectorTest::testAddPieceStats_bitfield()
|
||||||
size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
|
size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
|
||||||
size_t counts[] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 };
|
size_t counts[] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 };
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
const std::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
||||||
|
|
||||||
for(size_t i = 0; i < 10; ++i) {
|
for(size_t i = 0; i < 10; ++i) {
|
||||||
|
@ -103,7 +106,7 @@ void RarestPieceSelectorTest::testAddPieceStats_bitfield()
|
||||||
size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
|
size_t indexes[] = { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };
|
||||||
size_t counts[] = { 0, 0, 0, 0, 0, 2, 2, 2, 2, 2 };
|
size_t counts[] = { 0, 0, 0, 0, 0, 2, 2, 2, 2, 2 };
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
const std::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
||||||
|
|
||||||
for(size_t i = 0; i < 10; ++i) {
|
for(size_t i = 0; i < 10; ++i) {
|
||||||
|
@ -135,7 +138,7 @@ void RarestPieceSelectorTest::testUpdatePieceStats()
|
||||||
size_t indexes[] = { 0, 1, 2, 3, 8, 9, 4, 5, 6, 7 };
|
size_t indexes[] = { 0, 1, 2, 3, 8, 9, 4, 5, 6, 7 };
|
||||||
size_t counts[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 };
|
size_t counts[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 };
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
const std::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
||||||
|
|
||||||
for(size_t i = 0; i < 10; ++i) {
|
for(size_t i = 0; i < 10; ++i) {
|
||||||
|
@ -165,7 +168,7 @@ void RarestPieceSelectorTest::testSubtractPieceStats()
|
||||||
size_t indexes[] = { 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 };
|
size_t indexes[] = { 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 };
|
||||||
size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
|
size_t counts[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
|
||||||
|
|
||||||
const std::deque<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
const std::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
|
||||||
|
|
||||||
for(size_t i = 0; i < 10; ++i) {
|
for(size_t i = 0; i < 10; ++i) {
|
||||||
|
|
Loading…
Reference in New Issue