summaryrefslogtreecommitdiffstats
path: root/content/browser/download/rate_estimator.h
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-29 15:19:18 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-29 15:19:18 +0000
commit30ae76441edc1625333188cd924a5a20d456fdbc (patch)
tree6eacf0775d3788b40f04db670b45fe9cea49b48c /content/browser/download/rate_estimator.h
parente20fbed2f4ab2a62d95dea67a119a2c1c8a14bf7 (diff)
downloadchromium_src-30ae76441edc1625333188cd924a5a20d456fdbc.zip
chromium_src-30ae76441edc1625333188cd924a5a20d456fdbc.tar.gz
chromium_src-30ae76441edc1625333188cd924a5a20d456fdbc.tar.bz2
downloads: Improve download rate estimation.
Previously, download rate was estimated as bytes_received/(current_time - download_start_time) Although simple, this would react slowly to dynamic changes in download time, or user initiated pauses. With this change, a ring buffer of the past 10 seconds of download time is used instead, and estimates are derived from that. It handles dynamic changes to bandwidth well. Pauses are handled reasonably well, as estimates are accurate after ten seconds - a better solution would be to clear the data rates when the user resumes from a pause. The main downside with this approach is it takes about 100 bytes of memory per active download, as well as adds some complexity. BUG=16390 TEST=content_unittests Review URL: https://chromiumcodereview.appspot.com/14697023 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202874 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/download/rate_estimator.h')
-rw-r--r--content/browser/download/rate_estimator.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/content/browser/download/rate_estimator.h b/content/browser/download/rate_estimator.h
new file mode 100644
index 0000000..b235cec
--- /dev/null
+++ b/content/browser/download/rate_estimator.h
@@ -0,0 +1,52 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_RATE_ESTIMATOR_H_
+#define CONTENT_BROWSER_DOWNLOAD_RATE_ESTIMATOR_H_
+
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/time.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+// RateEstimator generates rate estimates based on recent activity.
+//
+// Internally it uses a fixed-size ring buffer, and develops estimates
+// based on a small sliding window of activity.
+class CONTENT_EXPORT RateEstimator {
+ public:
+ RateEstimator();
+ RateEstimator(base::TimeDelta bucket_time,
+ size_t num_buckets,
+ base::TimeTicks now);
+ ~RateEstimator();
+
+ // Increment the counter by |count|. The first variant uses the current time,
+ // the second variant provides the time that |count| is observed.
+ void Increment(uint32 count);
+ void Increment(uint32 count, base::TimeTicks now);
+
+ // Get a rate estimate, in terms of counts/second. The first variant uses the
+ // current time, the second variant provides the time.
+ uint64 GetCountPerSecond() const;
+ uint64 GetCountPerSecond(base::TimeTicks now) const;
+
+ private:
+ void ClearOldBuckets(base::TimeTicks now);
+ void ResetBuckets(base::TimeTicks now);
+
+ std::vector<uint32> history_;
+ base::TimeDelta bucket_time_;
+ size_t oldest_index_;
+ size_t bucket_count_;
+ base::TimeTicks oldest_time_;
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_DOWNLOAD_RATE_ESTIMATOR_H_