summaryrefslogtreecommitdiff
path: root/src/SpeedCalc.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-03-06 08:29:53 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-03-06 08:29:53 +0000
commit8d09b069e2b709d8657f5fdbcf2a933515545f39 (patch)
tree431bf39e4ce0a90c7fb4804297562c0c4c93c478 /src/SpeedCalc.cc
parent7637fd76a27d8a97cd32d7597d5afb3361fe0d28 (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.cc39
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) {