diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-03-06 08:29:53 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-03-06 08:29:53 +0000 |
| commit | 8d09b069e2b709d8657f5fdbcf2a933515545f39 (patch) | |
| tree | 431bf39e4ce0a90c7fb4804297562c0c4c93c478 /src/SpeedCalc.cc | |
| parent | 7637fd76a27d8a97cd32d7597d5afb3361fe0d28 (diff) | |
2010-03-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added Time global::wallclock to cache "current time" to reduce the
call gettimeofday(). Global variables are now in namespace global.
* src/AbstractCommand.cc
* src/ActivePeerConnectionCommand.cc
* src/AdaptiveURISelector.cc
* src/BtLeecherStateChoke.cc
* src/BtLeecherStateChoke.h
* src/BtSeederStateChoke.cc
* src/BtSeederStateChoke.h
* src/BtStopDownloadCommand.cc
* src/ConsoleStatCalc.cc
* src/DHTBucket.cc
* src/DHTGetPeersCommand.cc
* src/DHTMessageTrackerEntry.cc
* src/DHTNode.cc
* src/DHTPeerAnnounceEntry.cc
* src/DHTPeerAnnounceStorage.cc
* src/DHTSetup.cc
* src/DefaultBtAnnounce.cc
* src/DefaultBtInteractive.cc
* src/DefaultBtMessageDispatcher.cc
* src/DefaultPeerStorage.cc
* src/DefaultPieceStorage.cc
* src/DownloadCommand.cc
* src/DownloadEngine.cc
* src/FileEntry.cc
* src/HttpServerBodyCommand.cc
* src/HttpServerCommand.cc
* src/HttpServerResponseCommand.cc
* src/LpdMessageDispatcher.cc
* src/MultiUrlRequestInfo.cc
* src/Peer.cc
* src/Peer.h
* src/PeerAbstractCommand.cc
* src/PeerStat.h
* src/RequestSlot.cc
* src/RequestSlot.h
* src/SegmentMan.cc
* src/ServerStatMan.cc
* src/SleepCommand.cc
* src/SpeedCalc.cc
* src/SpeedCalc.h
* src/TimeA2.cc
* src/TimeA2.h
* src/TimeBasedCommand.cc
* src/TimeSeedCriteria.h
* src/UTMetadataRequestTracker.h
* src/UTPexExtensionMessage.cc
* src/wallclock.h
Diffstat (limited to 'src/SpeedCalc.cc')
| -rw-r--r-- | src/SpeedCalc.cc | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/src/SpeedCalc.cc b/src/SpeedCalc.cc index 6226bac2..59c4fe66 100644 --- a/src/SpeedCalc.cc +++ b/src/SpeedCalc.cc @@ -33,23 +33,25 @@ */ /* copyright --> */ #include "SpeedCalc.h" + #include <algorithm> #include <functional> +#include "wallclock.h" + namespace aria2 { #define CHANGE_INTERVAL_SEC 15 -class Reset { -public: - void operator()(Time& tm) { - tm.reset(); - } -}; +SpeedCalc::SpeedCalc():sw(0), maxSpeed(0), prevSpeed(0), accumulatedLength(0), + nextInterval(CHANGE_INTERVAL_SEC) +{ + std::fill(&lengthArray[0], &lengthArray[2], 0); +} void SpeedCalc::reset() { std::fill(&lengthArray[0], &lengthArray[2], 0); - std::for_each(&cpArray[0], &cpArray[2], Reset()); + std::for_each(&cpArray[0], &cpArray[2], std::mem_fun_ref(&Time::reset)); sw = 0; maxSpeed = 0; prevSpeed = 0; @@ -59,22 +61,7 @@ void SpeedCalc::reset() { } unsigned int SpeedCalc::calculateSpeed() { - int64_t milliElapsed = cpArray[sw].differenceInMillis(); - if(milliElapsed) { - unsigned int speed = lengthArray[sw]*1000/milliElapsed; - prevSpeed = speed; - maxSpeed = std::max(speed, maxSpeed); - if(isIntervalOver(milliElapsed)) { - changeSw(); - } - return speed; - } else { - return prevSpeed; - } -} - -unsigned int SpeedCalc::calculateSpeed(const struct timeval& now) { - int64_t milliElapsed = cpArray[sw].differenceInMillis(now); + int64_t milliElapsed = cpArray[sw].differenceInMillis(global::wallclock); if(milliElapsed) { unsigned int speed = lengthArray[sw]*1000/milliElapsed; prevSpeed = speed; @@ -98,7 +85,7 @@ void SpeedCalc::update(size_t bytes) { } bool SpeedCalc::isIntervalOver() const { - return nextInterval <= cpArray[sw].difference(); + return nextInterval <= cpArray[sw].difference(global::wallclock); } bool SpeedCalc::isIntervalOver(int64_t milliElapsed) const @@ -110,11 +97,11 @@ void SpeedCalc::changeSw() { lengthArray[sw] = 0; cpArray[sw].reset(); sw ^= 0x01; - nextInterval = cpArray[sw].difference()+CHANGE_INTERVAL_SEC; + nextInterval = cpArray[sw].difference(global::wallclock)+CHANGE_INTERVAL_SEC; } unsigned int SpeedCalc::calculateAvgSpeed() const { - uint64_t milliElapsed = start.differenceInMillis(); + uint64_t milliElapsed = start.differenceInMillis(global::wallclock); // if milliElapsed is too small, the average speed is rubish, better return 0 if(milliElapsed > 4) { |
