Переглянути джерело

2009-03-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Replaced std::vector<SharedHandle<PieceStats> _sortedPieceStats
	with std::vector<size_t> _sortedPieceStatIndexes to reduce the
	cost of std::rotate().
	* src/RarestPieceSelector.cc
	* src/RarestPieceSelector.h
	* test/RarestPieceSelectorTest.cc
Tatsuhiro Tsujikawa 16 роки тому
батько
коміт
289ae1b635
4 змінених файлів з 100 додано та 47 видалено
  1. 15 0
      ChangeLog
  2. 49 24
      src/RarestPieceSelector.cc
  3. 4 2
      src/RarestPieceSelector.h
  4. 32 21
      test/RarestPieceSelectorTest.cc

+ 15 - 0
ChangeLog

@@ -1,3 +1,18 @@
+2009-03-25  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Replaced std::vector<SharedHandle<PieceStats> _sortedPieceStats
+	with std::vector<size_t> _sortedPieceStatIndexes to reduce the
+	cost of std::rotate().
+	* src/RarestPieceSelector.cc
+	* src/RarestPieceSelector.h
+	* test/RarestPieceSelectorTest.cc
+
+2009-03-22  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Updated usage doc for --bt-tracker-interval option.
+	* src/usage_text.h
+	* doc/aria2c.1.txt
+
 2009-03-22  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Documented --bt-tracker-interval option in man page.

+ 49 - 24
src/RarestPieceSelector.cc

@@ -98,22 +98,24 @@ public:
 };
 
 RarestPieceSelector::RarestPieceSelector(size_t pieceNum, bool randomShuffle):
-  _pieceStats(pieceNum)
+  _pieceStats(pieceNum),
+  _sortedPieceStatIndexes(pieceNum)
 {
   std::generate(_pieceStats.begin(), _pieceStats.end(), GenPieceStat());
-  _sortedPieceStats = _pieceStats;
+  std::vector<SharedHandle<PieceStat> > sortedPieceStats(_pieceStats);
   // we need some randomness in ordering.
   if(randomShuffle) {
-    std::random_shuffle(_sortedPieceStats.begin(), _sortedPieceStats.end(),
+    std::random_shuffle(sortedPieceStats.begin(), sortedPieceStats.end(),
 			*(SimpleRandomizer::getInstance().get()));
   }
   {
     size_t order = 0;
-    for(std::vector<SharedHandle<PieceStat> >::iterator i = _sortedPieceStats.begin();
-	i != _sortedPieceStats.end(); ++i) {
+    for(std::vector<SharedHandle<PieceStat> >::iterator i =
+	  sortedPieceStats.begin(); i != sortedPieceStats.end(); ++i) {
+      _sortedPieceStatIndexes[order] = (*i)->getIndex();
       (*i)->setOrder(order++);
     }
-  }
+  }  
 }
 
 class FindRarestPiece
@@ -123,9 +125,9 @@ private:
 public:
   FindRarestPiece(const std::deque<size_t>& indexes):_indexes(indexes) {}
 
-  bool operator()(const SharedHandle<PieceStat>& pieceStat)
+  bool operator()(const size_t& index)
   {
-    return std::binary_search(_indexes.begin(), _indexes.end(), pieceStat->getIndex());
+    return std::binary_search(_indexes.begin(), _indexes.end(), index);
   }
 };
 
@@ -133,17 +135,30 @@ bool RarestPieceSelector::select
 (size_t& index,
  const std::deque<size_t>& candidateIndexes) const
 {
-  std::vector<SharedHandle<PieceStat> >::const_iterator i =
-    std::find_if(_sortedPieceStats.begin(), _sortedPieceStats.end(),
+  std::vector<size_t>::const_iterator i =
+    std::find_if(_sortedPieceStatIndexes.begin(), _sortedPieceStatIndexes.end(),
 		 FindRarestPiece(candidateIndexes));
-  if(i == _sortedPieceStats.end()) {
+  if(i == _sortedPieceStatIndexes.end()) {
     return false;
   } else {
-    index = (*i)->getIndex();
+    index = *i;
     return true;
   }
 }
 
+class PieceStatRarer {
+private:
+  const std::vector<SharedHandle<PieceStat> >& _pieceStats;
+public:
+  PieceStatRarer(const std::vector<SharedHandle<PieceStat> >& ps):
+    _pieceStats(ps) {}
+
+  bool operator()(size_t lhs, size_t rhs) const
+  {
+    return _pieceStats[lhs] < _pieceStats[rhs];
+  }
+};
+
 void RarestPieceSelector::addPieceStats(const unsigned char* bitfield,
 					size_t bitfieldLength)
 {
@@ -158,7 +173,8 @@ void RarestPieceSelector::addPieceStats(const unsigned char* bitfield,
     }
 
   }
-  std::sort(_sortedPieceStats.begin(), _sortedPieceStats.end());
+  std::sort(_sortedPieceStatIndexes.begin(), _sortedPieceStatIndexes.end(),
+	    PieceStatRarer(_pieceStats));
 }
 
 void RarestPieceSelector::subtractPieceStats(const unsigned char* bitfield,
@@ -175,7 +191,8 @@ void RarestPieceSelector::subtractPieceStats(const unsigned char* bitfield,
     }
 
   }
-  std::sort(_sortedPieceStats.begin(), _sortedPieceStats.end());
+  std::sort(_sortedPieceStatIndexes.begin(), _sortedPieceStatIndexes.end(),
+	    PieceStatRarer(_pieceStats));
 }
 
 void RarestPieceSelector::updatePieceStats(const unsigned char* newBitfield,
@@ -195,28 +212,36 @@ void RarestPieceSelector::updatePieceStats(const unsigned char* newBitfield,
     }
 
   }
-  std::sort(_sortedPieceStats.begin(), _sortedPieceStats.end());
+  std::sort(_sortedPieceStatIndexes.begin(), _sortedPieceStatIndexes.end(),
+	    PieceStatRarer(_pieceStats));
 }
 
 void RarestPieceSelector::addPieceStats(size_t index)
 {
-  SharedHandle<PieceStat> pieceStat(_pieceStats[index]);
-  std::vector<SharedHandle<PieceStat> >::iterator cur =
-    std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
-		     pieceStat);
+  std::vector<size_t>::iterator cur =
+    std::lower_bound(_sortedPieceStatIndexes.begin(),
+		     _sortedPieceStatIndexes.end(),
+		     index, PieceStatRarer(_pieceStats));
 
-  pieceStat->addCount();
+  _pieceStats[index]->addCount();
 
-  std::vector<SharedHandle<PieceStat> >::iterator to =
-    std::upper_bound(cur+1, _sortedPieceStats.end(), pieceStat);
+  std::vector<size_t>::iterator to =
+    std::upper_bound(cur+1, _sortedPieceStatIndexes.end(),
+		     index, PieceStatRarer(_pieceStats));
   
   std::rotate(cur, cur+1, to);
 }
 
+const std::vector<size_t>&
+RarestPieceSelector::getSortedPieceStatIndexes() const
+{
+  return _sortedPieceStatIndexes;
+}
+
 const std::vector<SharedHandle<PieceStat> >&
-RarestPieceSelector::getSortedPieceStats() const
+RarestPieceSelector::getPieceStats() const
 {
-  return _sortedPieceStats;
+  return _pieceStats;
 }
 
 } // namespace aria2

+ 4 - 2
src/RarestPieceSelector.h

@@ -64,7 +64,7 @@ class RarestPieceSelector:public PieceSelector {
 private:
   std::vector<SharedHandle<PieceStat> > _pieceStats;
 
-  std::vector<SharedHandle<PieceStat> > _sortedPieceStats;
+  std::vector<size_t> _sortedPieceStatIndexes;
 public:
   RarestPieceSelector(size_t pieceNum, bool randomShuffle);
 
@@ -83,7 +83,9 @@ public:
 				size_t newBitfieldLength,
 				const unsigned char* oldBitfield);
 
-  const std::vector<SharedHandle<PieceStat> >& getSortedPieceStats() const;
+  const std::vector<size_t>& getSortedPieceStatIndexes() const;
+
+  const std::vector<SharedHandle<PieceStat> >& getPieceStats() const;
 };
 
 } // namespace aria2

+ 32 - 21
test/RarestPieceSelectorTest.cc

@@ -40,12 +40,13 @@ 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::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
+    const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
+    const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
     CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
     
     for(size_t i = 0; i < 10; ++i) {
-      CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
-      CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
+      CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
+      CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
     }
   }
 
@@ -55,11 +56,12 @@ 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::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
+    const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
+    const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
 
     for(size_t i = 0; i < 10; ++i) {
-      CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
-      CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
+      CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
+      CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
     }
   }
 
@@ -72,11 +74,12 @@ 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::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
+    const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
+    const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
 
     for(size_t i = 0; i < 10; ++i) {
-      CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
-      CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
+      CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
+      CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
     }
   }
 
@@ -91,12 +94,14 @@ 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::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
+    const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
+    const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
+
     CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
     
     for(size_t i = 0; i < 10; ++i) {
-      CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
-      CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
+      CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
+      CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
     }
   }
 
@@ -106,12 +111,14 @@ 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::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
+    const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
+    const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
+
     CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
     
     for(size_t i = 0; i < 10; ++i) {
-      CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
-      CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
+      CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
+      CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
     }
   }
 }
@@ -138,12 +145,14 @@ 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::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
+    const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
+    const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
+
     CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
     
     for(size_t i = 0; i < 10; ++i) {
-      CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
-      CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
+      CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
+      CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
     }
   }
 }
@@ -168,12 +177,14 @@ 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::vector<SharedHandle<PieceStat> >& stats(selector.getSortedPieceStats());
+    const std::vector<size_t>& statsidx(selector.getSortedPieceStatIndexes());
+    const std::vector<SharedHandle<PieceStat> >& stats(selector.getPieceStats());
+
     CPPUNIT_ASSERT_EQUAL((size_t)10, stats.size());
     
     for(size_t i = 0; i < 10; ++i) {
-      CPPUNIT_ASSERT_EQUAL(indexes[i], stats[i]->getIndex());
-      CPPUNIT_ASSERT_EQUAL(counts[i], stats[i]->getCount());
+      CPPUNIT_ASSERT_EQUAL(indexes[i], statsidx[i]);
+      CPPUNIT_ASSERT_EQUAL(counts[i], stats[statsidx[i]]->getCount());
     }
   }
 }