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

Side by Side Diff: chrome/browser/net/load_time_stats.cc

Issue 10933103: fix build break (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/net/load_time_stats.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/net/load_time_stats.h" 5 #include "chrome/browser/net/load_time_stats.h"
6 6
7 #include "base/metrics/histogram.h" 7 #include "base/metrics/histogram.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/string_number_conversions.h" 9 #include "base/string_number_conversions.h"
10 #include "base/timer.h" 10 #include "base/timer.h"
11 #include "chrome/browser/browser_process.h" 11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/io_thread.h" 12 #include "chrome/browser/io_thread.h"
13 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/ui/tab_contents/tab_contents.h" 14 #include "chrome/browser/ui/tab_contents/tab_contents.h"
15 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
16 #include "content/public/browser/render_process_host.h" 16 #include "content/public/browser/render_process_host.h"
17 #include "content/public/browser/render_view_host.h" 17 #include "content/public/browser/render_view_host.h"
18 #include "content/public/browser/resource_request_info.h" 18 #include "content/public/browser/resource_request_info.h"
19 #include "content/public/browser/web_contents.h" 19 #include "content/public/browser/web_contents.h"
20 #include "net/url_request/url_request.h" 20 #include "net/url_request/url_request.h"
21 21
22 using content::BrowserThread; 22 using content::BrowserThread;
23 using content::RenderViewHost; 23 using content::RenderViewHost;
24 using content::ResourceRequestInfo; 24 using content::ResourceRequestInfo;
25 using std::string; 25 using std::string;
26 26
27 #if defined(COMPILER_GCC)
28
29 namespace BASE_HASH_NAMESPACE {
30 template <>
31 struct hash<const net::URLRequest*> {
32 std::size_t operator()(const net::URLRequest* value) const {
33 return reinterpret_cast<std::size_t>(value);
34 }
35 };
36 }
37
38 #endif
39
40 namespace { 27 namespace {
41 28
42 bool GetRenderView(const net::URLRequest& request, 29 bool GetRenderView(const net::URLRequest& request,
43 int* process_id, int* route_id) { 30 int* process_id, int* route_id) {
44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 31 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
45 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request); 32 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request);
46 if (!info) 33 if (!info)
47 return false; 34 return false;
48 return info->GetAssociatedRenderView(process_id, route_id); 35 return info->GetAssociatedRenderView(process_id, route_id);
49 } 36 }
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 RenderViewId render_view_id_; 170 RenderViewId render_view_id_;
184 PerStatusStatsArray per_status_stats_; 171 PerStatusStatsArray per_status_stats_;
185 bool spinner_started_; 172 bool spinner_started_;
186 base::TimeTicks load_start_time_; 173 base::TimeTicks load_start_time_;
187 int next_timer_index_; 174 int next_timer_index_;
188 base::Timer timer_; 175 base::Timer timer_;
189 // Currently active URLRequests. 176 // Currently active URLRequests.
190 RequestMap active_requests_; 177 RequestMap active_requests_;
191 }; 178 };
192 179
180 class LoadTimeStats::URLRequestStats {
181 public:
182 URLRequestStats()
183 : done_(false),
184 start_time_(GetCurrentTime()),
185 status_(REQUEST_STATUS_ACTIVE) {
186 }
187 void OnStatusChange(RequestStatus new_status) {
188 if (done_)
189 return;
190 DCHECK_GE(status_, 0);
191 DCHECK_GE(new_status, 0);
192 DCHECK_LE(status_, REQUEST_STATUS_ACTIVE);
193 DCHECK_LE(new_status, REQUEST_STATUS_ACTIVE);
194 base::TimeTicks now = GetCurrentTime();
195 base::TimeDelta elapsed = now - start_time_;
196 status_times_[status_] += elapsed;
197 start_time_ = now;
198 status_ = new_status;
199 }
200 void RequestDone() {
201 DCHECK(!done_);
202 // Dummy status change to add last elapsed time.
203 OnStatusChange(REQUEST_STATUS_ACTIVE);
204 done_ = true;
205
206 UMA_HISTOGRAM_TIMES("LoadTimeStats.Request_CacheWait_Time",
207 status_times_[REQUEST_STATUS_CACHE_WAIT]);
208 UMA_HISTOGRAM_TIMES("LoadTimeStats.Request_NetworkWait_Time",
209 status_times_[REQUEST_STATUS_NETWORK_WAIT]);
210 UMA_HISTOGRAM_TIMES("LoadTimeStats.Request_Active_Time",
211 status_times_[REQUEST_STATUS_ACTIVE]);
212
213 base::TimeDelta total_time;
214 for (int status = REQUEST_STATUS_CACHE_WAIT;
215 status <= REQUEST_STATUS_ACTIVE;
216 status++) {
217 total_time += status_times_[status];
218 }
219 if (total_time.InMilliseconds() <= 0)
220 return;
221
222 for (int status = REQUEST_STATUS_CACHE_WAIT;
223 status <= REQUEST_STATUS_ACTIVE;
224 status++) {
225 int64 fraction_percentage = 100 *
226 status_times_[status].InMilliseconds() /
227 total_time.InMilliseconds();
228 DCHECK(fraction_percentage >= 0 && fraction_percentage <= 100);
229 switch (status) {
230 case REQUEST_STATUS_CACHE_WAIT:
231 UMA_HISTOGRAM_PERCENTAGE(
232 "LoadTimeStats.Request_CacheWait_Percentage",
233 fraction_percentage);
234 break;
235 case REQUEST_STATUS_NETWORK_WAIT:
236 UMA_HISTOGRAM_PERCENTAGE(
237 "LoadTimeStats.Request_NetworkWait_Percentage",
238 fraction_percentage);
239 break;
240 case REQUEST_STATUS_ACTIVE:
241 UMA_HISTOGRAM_PERCENTAGE(
242 "LoadTimeStats.Request_Active_Percentage", fraction_percentage);
243 break;
244 }
245 }
246 }
247
248 private:
249 base::TimeTicks GetCurrentTime() {
250 return base::TimeTicks::Now();
251 }
252 bool done_;
253 base::TimeTicks start_time_;
254 RequestStatus status_;
255 base::TimeDelta status_times_[REQUEST_STATUS_MAX];
256 };
257
193 LoadTimeStatsTabHelper::LoadTimeStatsTabHelper(TabContents* tab) 258 LoadTimeStatsTabHelper::LoadTimeStatsTabHelper(TabContents* tab)
194 : content::WebContentsObserver(tab->web_contents()) { 259 : content::WebContentsObserver(tab->web_contents()) {
195 is_otr_profile_ = tab->profile()->IsOffTheRecord(); 260 is_otr_profile_ = tab->profile()->IsOffTheRecord();
196 } 261 }
197 262
198 LoadTimeStatsTabHelper::~LoadTimeStatsTabHelper() { 263 LoadTimeStatsTabHelper::~LoadTimeStatsTabHelper() {
199 } 264 }
200 265
201 void LoadTimeStatsTabHelper::DidStartProvisionalLoadForFrame( 266 void LoadTimeStatsTabHelper::DidStartProvisionalLoadForFrame(
202 int64 frame_id, 267 int64 frame_id,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 0, 101, 51, base::Histogram::kUmaTargetedHistogramFlag)); 316 0, 101, 51, base::Histogram::kUmaTargetedHistogramFlag));
252 } 317 }
253 DCHECK_EQ(histograms_[status][histogram_type].size(), 318 DCHECK_EQ(histograms_[status][histogram_type].size(),
254 arraysize(kStatsCollectionTimesMs)); 319 arraysize(kStatsCollectionTimesMs));
255 } 320 }
256 } 321 }
257 } 322 }
258 323
259 LoadTimeStats::~LoadTimeStats() { 324 LoadTimeStats::~LoadTimeStats() {
260 STLDeleteValues(&tab_load_stats_); 325 STLDeleteValues(&tab_load_stats_);
326 STLDeleteValues(&request_stats_);
327 }
328
329 LoadTimeStats::URLRequestStats* LoadTimeStats::GetRequestStats(
330 const net::URLRequest* request) {
331 RequestStatsMap::const_iterator it = request_stats_.find(request);
332 if (it != request_stats_.end())
333 return it->second;
334 URLRequestStats* new_request_stats = new URLRequestStats();
335 request_stats_[request] = new_request_stats;
336 return new_request_stats;
261 } 337 }
262 338
263 LoadTimeStats::TabLoadStats* LoadTimeStats::GetTabLoadStats( 339 LoadTimeStats::TabLoadStats* LoadTimeStats::GetTabLoadStats(
264 std::pair<int, int> render_view_id) { 340 std::pair<int, int> render_view_id) {
265 TabLoadStatsMap::const_iterator it = tab_load_stats_.find(render_view_id); 341 TabLoadStatsMap::const_iterator it = tab_load_stats_.find(render_view_id);
266 if (it != tab_load_stats_.end()) 342 if (it != tab_load_stats_.end())
267 return it->second; 343 return it->second;
268 TabLoadStats* new_tab_load_stats = new TabLoadStats(render_view_id, this); 344 TabLoadStats* new_tab_load_stats = new TabLoadStats(render_view_id, this);
269 tab_load_stats_[render_view_id] = new_tab_load_stats; 345 tab_load_stats_[render_view_id] = new_tab_load_stats;
270 return new_tab_load_stats; 346 return new_tab_load_stats;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 DCHECK_GE(status_stats->num_active(), 0); 405 DCHECK_GE(status_stats->num_active(), 0);
330 } 406 }
331 if (new_status != REQUEST_STATUS_NONE) { 407 if (new_status != REQUEST_STATUS_NONE) {
332 TabLoadStats::PerStatusStats* status_stats = 408 TabLoadStats::PerStatusStats* status_stats =
333 &(stats->per_status_stats()[new_status]); 409 &(stats->per_status_stats()[new_status]);
334 DCHECK_GE(status_stats->num_active(), 0); 410 DCHECK_GE(status_stats->num_active(), 0);
335 status_stats->UpdateTotalTimes(); 411 status_stats->UpdateTotalTimes();
336 status_stats->IncrementNumActive(); 412 status_stats->IncrementNumActive();
337 DCHECK_GE(status_stats->num_active(), 0); 413 DCHECK_GE(status_stats->num_active(), 0);
338 stats->active_requests()[&request] = new_status; 414 stats->active_requests()[&request] = new_status;
415 URLRequestStats* request_stats = GetRequestStats(&request);
416 request_stats->OnStatusChange(new_status);
339 } else { 417 } else {
340 stats->active_requests().erase(&request); 418 stats->active_requests().erase(&request);
341 } 419 }
342 } 420 }
343 421
422 void LoadTimeStats::OnURLRequestDestroyed(const net::URLRequest& request) {
423 if (request_stats_.count(&request) < 1)
424 return;
425 scoped_ptr<URLRequestStats> request_stats(GetRequestStats(&request));
426 request_stats_.erase(&request);
427 request_stats->RequestDone();
428 }
429
344 void LoadTimeStats::OnTabEvent(std::pair<int, int> render_view_id, 430 void LoadTimeStats::OnTabEvent(std::pair<int, int> render_view_id,
345 TabEvent event) { 431 TabEvent event) {
346 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 432 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
347 TabLoadStats* stats = GetTabLoadStats(render_view_id); 433 TabLoadStats* stats = GetTabLoadStats(render_view_id);
348 if (event == SPINNER_START) { 434 if (event == SPINNER_START) {
349 stats->set_spinner_started(true); 435 stats->set_spinner_started(true);
350 stats->set_load_start_time(base::TimeTicks::Now()); 436 stats->set_load_start_time(base::TimeTicks::Now());
351 for (int status = REQUEST_STATUS_CACHE_WAIT; 437 for (int status = REQUEST_STATUS_CACHE_WAIT;
352 status <= REQUEST_STATUS_ACTIVE; status++) { 438 status <= REQUEST_STATUS_ACTIVE; status++) {
353 stats->per_status_stats()[status].ResetTimes(); 439 stats->per_status_stats()[status].ResetTimes();
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 if (type == ChromeURLRequestContext::CONTEXT_TYPE_MAIN) 544 if (type == ChromeURLRequestContext::CONTEXT_TYPE_MAIN)
459 main_request_contexts_.insert(context); 545 main_request_contexts_.insert(context);
460 } 546 }
461 547
462 void LoadTimeStats::UnregisterURLRequestContext( 548 void LoadTimeStats::UnregisterURLRequestContext(
463 const net::URLRequestContext* context) { 549 const net::URLRequestContext* context) {
464 main_request_contexts_.erase(context); 550 main_request_contexts_.erase(context);
465 } 551 }
466 552
467 } // namespace chrome_browser_net 553 } // namespace chrome_browser_net
OLDNEW
« no previous file with comments | « chrome/browser/net/load_time_stats.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698