diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-03-20 13:35:40 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-03-20 13:35:40 +0000 |
| commit | 36446825114c6af908014d93fab59f1afcf5ed78 (patch) | |
| tree | 4f122b707ef68a02c8afb8c7546597c21163e4c9 | |
| parent | ef927009b7c03e7034b2eeabc845ed23c6fb4fbc (diff) | |
2009-03-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Refactored getMissingIndexRandomly, getFirstMissingIndex,
getAllMissingBlockIndexes to reduce a call to
array_function_base::operator[].
* src/BitfieldMan.cc
| -rw-r--r-- | ChangeLog | 7 | ||||
| -rw-r--r-- | src/BitfieldMan.cc | 28 |
2 files changed, 23 insertions, 12 deletions
@@ -1,5 +1,12 @@ 2009-03-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> + Refactored getMissingIndexRandomly, getFirstMissingIndex, + getAllMissingBlockIndexes to reduce a call to + array_function_base::operator[]. + * src/BitfieldMan.cc + +2009-03-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> + Cached TransferStat/download speed to avoid to sum them up in each call. * src/DefaultPeerStorage.cc diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index 7421b016..444e93a0 100644 --- a/src/BitfieldMan.cc +++ b/src/BitfieldMan.cc @@ -212,8 +212,10 @@ bool BitfieldMan::getMissingIndexRandomly(size_t& index, } else { mask = 0xff; } - if(bitfield[byte]&mask) { - index = byte*8+getNthBitIndex(bitfield[byte], 1); + unsigned char bits = bitfield[byte]; + + if(bits&mask) { + index = byte*8+getNthBitIndex(bits, 1); return true; } byte++; @@ -270,11 +272,12 @@ template<typename Array> bool BitfieldMan::getFirstMissingIndex(size_t& index, const Array& bitfield, size_t bitfieldLength) const { for(size_t i = 0; i < bitfieldLength; ++i) { - size_t base = i*8; - for(size_t bi = 0; bi < 8 && base+bi < blocks; ++bi) { - unsigned char mask = 128 >> bi; - if(bitfield[i] & mask) { - index = base+bi; + unsigned char bits = bitfield[i]; + unsigned char mask = 128; + size_t tindex = i*8; + for(size_t bi = 0; bi < 8 && tindex < blocks; ++bi, mask >>= 1, ++tindex) { + if(bits & mask) { + index = tindex; return true; } } @@ -395,11 +398,12 @@ bool BitfieldMan::getAllMissingIndexes(std::deque<size_t>& indexes, size_t bitfieldLength) const { for(size_t i = 0; i < bitfieldLength; ++i) { - size_t base = i*8; - for(size_t bi = 0; bi < 8 && base+bi < blocks; ++bi) { - unsigned char mask = 128 >> bi; - if(bitfield[i] & mask) { - indexes.push_back(base+bi); + unsigned char bits = bitfield[i]; + unsigned char mask = 128; + size_t index = i*8; + for(size_t bi = 0; bi < 8 && index < blocks; ++bi, mask >>= 1, ++index) { + if(bits & mask) { + indexes.push_back(index); } } } |
