Kaynağa Gözat

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
Tatsuhiro Tsujikawa 16 yıl önce
ebeveyn
işleme
662a90ce9b

+ 7 - 0
ChangeLog

@@ -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>
 
 	Refactored getMissingIndexRandomly, getFirstMissingIndex,

+ 10 - 13
src/RarestPieceSelector.cc

@@ -109,7 +109,7 @@ RarestPieceSelector::RarestPieceSelector(size_t pieceNum, bool randomShuffle):
   }
   {
     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)->setOrder(order++);
     }
@@ -133,7 +133,7 @@ bool RarestPieceSelector::select
 (size_t& index,
  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(),
 		 FindRarestPiece(candidateIndexes));
   if(i == _sortedPieceStats.end()) {
@@ -201,22 +201,19 @@ void RarestPieceSelector::updatePieceStats(const unsigned char* newBitfield,
 void RarestPieceSelector::addPieceStats(size_t index)
 {
   SharedHandle<PieceStat> pieceStat(_pieceStats[index]);
-  {
-    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::vector<SharedHandle<PieceStat> >::iterator cur =
     std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
 		     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
 {
   return _sortedPieceStats;

+ 5 - 3
src/RarestPieceSelector.h

@@ -37,6 +37,8 @@
 
 #include "PieceSelector.h"
 
+#include <vector>
+
 namespace aria2 {
 
 class PieceStat {
@@ -60,9 +62,9 @@ public:
 
 class RarestPieceSelector:public PieceSelector {
 private:
-  std::deque<SharedHandle<PieceStat> > _pieceStats;
+  std::vector<SharedHandle<PieceStat> > _pieceStats;
 
-  std::deque<SharedHandle<PieceStat> > _sortedPieceStats;
+  std::vector<SharedHandle<PieceStat> > _sortedPieceStats;
 public:
   RarestPieceSelector(size_t pieceNum, bool randomShuffle);
 
@@ -81,7 +83,7 @@ public:
 				size_t newBitfieldLength,
 				const unsigned char* oldBitfield);
 
-  const std::deque<SharedHandle<PieceStat> >& getSortedPieceStats() const;
+  const std::vector<SharedHandle<PieceStat> >& getSortedPieceStats() const;
 };
 
 } // namespace aria2

+ 12 - 9
test/RarestPieceSelectorTest.cc

@@ -1,10 +1,13 @@
 #include "RarestPieceSelector.h"
-#include "Exception.h"
-#include "Util.h"
+
 #include <cstring>
 #include <iostream>
+
 #include <cppunit/extensions/HelperMacros.h>
 
+#include "Exception.h"
+#include "Util.h"
+
 namespace aria2 {
 
 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 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());
     
     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 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) {
       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 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) {
       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 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());
     
     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 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());
     
     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 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());
     
     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 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());
     
     for(size_t i = 0; i < 10; ++i) {