Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: chrome/browser/predictors/resource_prefetcher.cc

Issue 2688633002: predictors: Add prefetching hit/miss histograms. (Closed)
Patch Set: Now with a test. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/predictors/resource_prefetcher.h" 5 #include "chrome/browser/predictors/resource_prefetcher.h"
6 6
7 #include <algorithm>
7 #include <iterator> 8 #include <iterator>
8 #include <utility> 9 #include <utility>
9 10
10 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
11 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
12 #include "content/public/browser/browser_thread.h" 13 #include "content/public/browser/browser_thread.h"
13 #include "net/base/io_buffer.h" 14 #include "net/base/io_buffer.h"
14 #include "net/base/load_flags.h" 15 #include "net/base/load_flags.h"
15 #include "net/base/request_priority.h" 16 #include "net/base/request_priority.h"
16 #include "net/url_request/url_request_context.h" 17 #include "net/url_request/url_request_context.h"
17 #include "url/origin.h" 18 #include "url/origin.h"
18 19
19 namespace { 20 namespace {
20 21
21 // The size of the buffer used to read the resource. 22 // The size of the buffer used to read the resource.
22 static const size_t kResourceBufferSizeBytes = 50000; 23 static const size_t kResourceBufferSizeBytes = 50000;
23 24
24 } // namespace 25 } // namespace
25 26
26 namespace predictors { 27 namespace predictors {
27 28
29 ResourcePrefetcher::PrefetchedRequestStats::PrefetchedRequestStats(
30 const GURL& resource_url,
31 bool was_cached,
32 size_t total_received_bytes)
33 : resource_url(resource_url),
34 was_cached(was_cached),
35 total_received_bytes(total_received_bytes) {} //
alexilin 2017/02/09 15:24:18 What is "//" for?
Benoit L 2017/02/13 16:13:15 Oops. Done.
36
37 ResourcePrefetcher::PrefetchedRequestStats::~PrefetchedRequestStats() {}
38
39 ResourcePrefetcher::PrefetcherStats::PrefetcherStats(const GURL& url)
40 : url(url) {}
41
42 ResourcePrefetcher::PrefetcherStats::~PrefetcherStats() {}
43
44 ResourcePrefetcher::PrefetcherStats::PrefetcherStats(
45 const PrefetcherStats& other)
46 : url(other.url),
47 start_time(other.start_time),
48 requests_stats(other.requests_stats) {}
49
28 ResourcePrefetcher::ResourcePrefetcher( 50 ResourcePrefetcher::ResourcePrefetcher(
29 Delegate* delegate, 51 Delegate* delegate,
30 const ResourcePrefetchPredictorConfig& config, 52 const ResourcePrefetchPredictorConfig& config,
31 const GURL& main_frame_url, 53 const GURL& main_frame_url,
32 const std::vector<GURL>& urls) 54 const std::vector<GURL>& urls)
33 : state_(INITIALIZED), 55 : state_(INITIALIZED),
34 delegate_(delegate), 56 delegate_(delegate),
35 config_(config), 57 config_(config),
36 main_frame_url_(main_frame_url), 58 main_frame_url_(main_frame_url),
37 prefetched_count_(0), 59 prefetched_count_(0),
38 prefetched_bytes_(0) { 60 prefetched_bytes_(0),
61 stats_(main_frame_url) {
39 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 62 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
40 63
41 std::copy(urls.begin(), urls.end(), std::back_inserter(request_queue_)); 64 std::copy(urls.begin(), urls.end(), std::back_inserter(request_queue_));
42 } 65 }
43 66
44 ResourcePrefetcher::~ResourcePrefetcher() {} 67 ResourcePrefetcher::~ResourcePrefetcher() {}
45 68
46 void ResourcePrefetcher::Start() { 69 void ResourcePrefetcher::Start() {
47 TRACE_EVENT_ASYNC_BEGIN0("browser", "ResourcePrefetcher::Prefetch", this); 70 TRACE_EVENT_ASYNC_BEGIN0("browser", "ResourcePrefetcher::Prefetch", this);
48 DCHECK(thread_checker_.CalledOnValidThread()); 71 DCHECK(thread_checker_.CalledOnValidThread());
49 72
50 CHECK_EQ(state_, INITIALIZED); 73 CHECK_EQ(state_, INITIALIZED);
51 state_ = RUNNING; 74 state_ = RUNNING;
52 75
76 stats_.start_time = base::TimeTicks::Now();
53 TryToLaunchPrefetchRequests(); 77 TryToLaunchPrefetchRequests();
54 } 78 }
55 79
56 void ResourcePrefetcher::Stop() { 80 void ResourcePrefetcher::Stop() {
57 TRACE_EVENT_ASYNC_END0("browser", "ResourcePrefetcher::Prefetch", this); 81 TRACE_EVENT_ASYNC_END0("browser", "ResourcePrefetcher::Prefetch", this);
58 DCHECK(thread_checker_.CalledOnValidThread()); 82 DCHECK(thread_checker_.CalledOnValidThread());
59 83
60 if (state_ == FINISHED) 84 if (state_ == FINISHED)
61 return; 85 return;
62 86
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 CHECK(request_queue_.empty() || state_ == STOPPED); 127 CHECK(request_queue_.empty() || state_ == STOPPED);
104 128
105 UMA_HISTOGRAM_COUNTS_100( 129 UMA_HISTOGRAM_COUNTS_100(
106 internal::kResourcePrefetchPredictorPrefetchedCountHistogram, 130 internal::kResourcePrefetchPredictorPrefetchedCountHistogram,
107 prefetched_count_); 131 prefetched_count_);
108 UMA_HISTOGRAM_COUNTS_10000( 132 UMA_HISTOGRAM_COUNTS_10000(
109 internal::kResourcePrefetchPredictorPrefetchedSizeHistogram, 133 internal::kResourcePrefetchPredictorPrefetchedSizeHistogram,
110 prefetched_bytes_ / 1024); 134 prefetched_bytes_ / 1024);
111 135
112 state_ = FINISHED; 136 state_ = FINISHED;
113 delegate_->ResourcePrefetcherFinished(this); 137 delegate_->ResourcePrefetcherFinished(this, stats_);
114 } 138 }
115 } 139 }
116 140
117 void ResourcePrefetcher::SendRequest(const GURL& url) { 141 void ResourcePrefetcher::SendRequest(const GURL& url) {
118 std::unique_ptr<net::URLRequest> url_request = 142 std::unique_ptr<net::URLRequest> url_request =
119 delegate_->GetURLRequestContext()->CreateRequest(url, net::LOW, this); 143 delegate_->GetURLRequestContext()->CreateRequest(url, net::LOW, this);
120 host_inflight_counts_[url.host()] += 1; 144 host_inflight_counts_[url.host()] += 1;
121 145
122 url_request->set_method("GET"); 146 url_request->set_method("GET");
123 url_request->set_first_party_for_cookies(main_frame_url_); 147 url_request->set_first_party_for_cookies(main_frame_url_);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 kResourceBufferSizeBytes)); 181 kResourceBufferSizeBytes));
158 bytes_read = request->Read(buffer.get(), kResourceBufferSizeBytes); 182 bytes_read = request->Read(buffer.get(), kResourceBufferSizeBytes);
159 if (bytes_read == net::ERR_IO_PENDING) { 183 if (bytes_read == net::ERR_IO_PENDING) {
160 return; 184 return;
161 } else if (bytes_read <= 0) { 185 } else if (bytes_read <= 0) {
162 if (bytes_read == 0) 186 if (bytes_read == 0)
163 RequestComplete(request); 187 RequestComplete(request);
164 FinishRequest(request); 188 FinishRequest(request);
165 return; 189 return;
166 } 190 }
167
168 } while (bytes_read > 0); 191 } while (bytes_read > 0);
169 } 192 }
170 193
171 void ResourcePrefetcher::RequestComplete(net::URLRequest* request) { 194 void ResourcePrefetcher::RequestComplete(net::URLRequest* request) {
172 ++prefetched_count_; 195 ++prefetched_count_;
173 prefetched_bytes_ += request->GetTotalReceivedBytes(); 196 size_t total_received_bytes = request->GetTotalReceivedBytes();
alexilin 2017/02/09 15:24:18 request->GetTotalReceivedBytes() returns int64_t I
Benoit L 2017/02/13 16:13:15 Done.
197 prefetched_bytes_ += total_received_bytes;
174 198
175 UMA_HISTOGRAM_ENUMERATION( 199 UMA_HISTOGRAM_ENUMERATION(
176 internal::kResourcePrefetchPredictorCachePatternHistogram, 200 internal::kResourcePrefetchPredictorCachePatternHistogram,
177 request->response_info().cache_entry_status, 201 request->response_info().cache_entry_status,
178 net::HttpResponseInfo::CacheEntryStatus::ENTRY_MAX); 202 net::HttpResponseInfo::CacheEntryStatus::ENTRY_MAX);
203
204 stats_.requests_stats.emplace_back(request->url(), request->was_cached(),
205 total_received_bytes);
179 } 206 }
180 207
181 void ResourcePrefetcher::OnReceivedRedirect( 208 void ResourcePrefetcher::OnReceivedRedirect(
182 net::URLRequest* request, 209 net::URLRequest* request,
183 const net::RedirectInfo& redirect_info, 210 const net::RedirectInfo& redirect_info,
184 bool* defer_redirect) { 211 bool* defer_redirect) {
185 FinishRequest(request); 212 FinishRequest(request);
186 } 213 }
187 214
188 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request, 215 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 if (bytes_read <= 0) { 249 if (bytes_read <= 0) {
223 FinishRequest(request); 250 FinishRequest(request);
224 return; 251 return;
225 } 252 }
226 253
227 if (bytes_read > 0) 254 if (bytes_read > 0)
228 ReadFullResponse(request); 255 ReadFullResponse(request);
229 } 256 }
230 257
231 } // namespace predictors 258 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698