OLD | NEW |
---|---|
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/prerender/prerender_local_predictor.h" | 5 #include "chrome/browser/prerender/prerender_local_predictor.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <ctype.h> | 8 #include <ctype.h> |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
11 | 11 |
12 #include "base/metrics/field_trial.h" | |
12 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
13 #include "base/timer.h" | 14 #include "base/timer.h" |
14 #include "chrome/browser/prerender/prerender_histograms.h" | 15 #include "chrome/browser/prerender/prerender_histograms.h" |
15 #include "chrome/browser/prerender/prerender_manager.h" | 16 #include "chrome/browser/prerender/prerender_manager.h" |
16 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
17 #include "chrome/browser/history/history.h" | 18 #include "chrome/browser/history/history.h" |
18 #include "chrome/browser/history/history_database.h" | 19 #include "chrome/browser/history/history_database.h" |
19 #include "chrome/browser/history/history_service_factory.h" | 20 #include "chrome/browser/history/history_service_factory.h" |
20 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
21 #include "content/public/common/page_transition_types.h" | 22 #include "content/public/common/page_transition_types.h" |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
193 return; | 194 return; |
194 visit_history_->push_back(info); | 195 visit_history_->push_back(info); |
195 if (static_cast<int>(visit_history_->size()) > kVisitHistoryPruneThreshold) { | 196 if (static_cast<int>(visit_history_->size()) > kVisitHistoryPruneThreshold) { |
196 visit_history_->erase(visit_history_->begin(), | 197 visit_history_->erase(visit_history_->begin(), |
197 visit_history_->begin() + kVisitHistoryPruneAmount); | 198 visit_history_->begin() + kVisitHistoryPruneAmount); |
198 } | 199 } |
199 RecordEvent(EVENT_ADD_VISIT_INITIALIZED); | 200 RecordEvent(EVENT_ADD_VISIT_INITIALIZED); |
200 if (current_prerender_.get() && | 201 if (current_prerender_.get() && |
201 current_prerender_->url_id == info.url_id && | 202 current_prerender_->url_id == info.url_id && |
202 IsPrerenderStillValid(current_prerender_.get())) { | 203 IsPrerenderStillValid(current_prerender_.get())) { |
203 prerender_manager_->histograms()->RecordLocalPredictorTimeUntilUsed( | 204 UMA_HISTOGRAM_CUSTOM_TIMES( |
205 "Prerender.LocalPredictorTimeUntilUsed", | |
204 GetCurrentTime() - current_prerender_->actual_start_time, | 206 GetCurrentTime() - current_prerender_->actual_start_time, |
205 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs)); | 207 base::TimeDelta::FromMilliseconds(10), |
208 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs), | |
209 50); | |
206 last_swapped_in_prerender_.reset(current_prerender_.release()); | 210 last_swapped_in_prerender_.reset(current_prerender_.release()); |
207 RecordEvent(EVENT_ADD_VISIT_PRERENDER_IDENTIFIED); | 211 RecordEvent(EVENT_ADD_VISIT_PRERENDER_IDENTIFIED); |
208 } | 212 } |
209 if (ShouldExcludeTransitionForPrediction(info.transition)) | 213 if (ShouldExcludeTransitionForPrediction(info.transition)) |
210 return; | 214 return; |
211 RecordEvent(EVENT_ADD_VISIT_RELEVANT_TRANSITION); | 215 RecordEvent(EVENT_ADD_VISIT_RELEVANT_TRANSITION); |
212 base::TimeDelta max_age = | 216 base::TimeDelta max_age = |
213 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs); | 217 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs); |
214 base::TimeDelta min_age = | 218 base::TimeDelta min_age = |
215 base::TimeDelta::FromMilliseconds(kMinLocalPredictionTimeMs); | 219 base::TimeDelta::FromMilliseconds(kMinLocalPredictionTimeMs); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
363 url, page_load_time)) { | 367 url, page_load_time)) { |
364 prerender.reset(last_swapped_in_prerender_.release()); | 368 prerender.reset(last_swapped_in_prerender_.release()); |
365 } | 369 } |
366 if (DoesPrerenderMatchPLTRecord(current_prerender_.get(), | 370 if (DoesPrerenderMatchPLTRecord(current_prerender_.get(), |
367 url, page_load_time)) { | 371 url, page_load_time)) { |
368 prerender.reset(current_prerender_.release()); | 372 prerender.reset(current_prerender_.release()); |
369 } | 373 } |
370 if (!prerender.get()) | 374 if (!prerender.get()) |
371 return; | 375 return; |
372 if (IsPrerenderStillValid(prerender.get())) { | 376 if (IsPrerenderStillValid(prerender.get())) { |
377 UMA_HISTOGRAM_CUSTOM_TIMES("Prerender.SimulatedLocalBrowsingBaselinePLT", | |
378 page_load_time, | |
379 base::TimeDelta::FromMilliseconds(10), | |
380 base::TimeDelta::FromSeconds(60), | |
381 100); | |
382 | |
373 base::TimeDelta prerender_age = GetCurrentTime() - prerender->start_time; | 383 base::TimeDelta prerender_age = GetCurrentTime() - prerender->start_time; |
374 prerender_manager_->histograms()->RecordSimulatedLocalBrowsingBaselinePLT( | |
375 page_load_time, url); | |
376 if (prerender_age > page_load_time) { | 384 if (prerender_age > page_load_time) { |
377 base::TimeDelta new_plt; | 385 base::TimeDelta new_plt; |
378 if (prerender_age < 2 * page_load_time) | 386 if (prerender_age < 2 * page_load_time) |
379 new_plt = 2 * page_load_time - prerender_age; | 387 new_plt = 2 * page_load_time - prerender_age; |
380 prerender_manager_->histograms()->RecordSimulatedLocalBrowsingPLT( | 388 UMA_HISTOGRAM_CUSTOM_TIMES("Prerender.SimulatedLocalBrowsingBaselinePLT", |
381 new_plt, url); | 389 new_plt, |
390 base::TimeDelta::FromMilliseconds(10), | |
391 base::TimeDelta::FromSeconds(60), | |
392 100); | |
382 } | 393 } |
383 | |
384 } | 394 } |
385 } | 395 } |
386 | 396 |
387 bool PrerenderLocalPredictor::IsPrerenderStillValid( | 397 bool PrerenderLocalPredictor::IsPrerenderStillValid( |
388 PrerenderLocalPredictor::PrerenderData* prerender) const { | 398 PrerenderLocalPredictor::PrerenderData* prerender) const { |
389 return (prerender && | 399 return (prerender && |
390 (prerender->start_time + | 400 (prerender->start_time + |
391 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs)) | 401 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs)) |
392 > GetCurrentTime()); | 402 > GetCurrentTime()); |
393 } | 403 } |
394 | 404 |
395 void PrerenderLocalPredictor::RecordEvent(PrerenderLocalPredictor::Event event) | 405 void PrerenderLocalPredictor::RecordEvent(PrerenderLocalPredictor::Event event) |
396 const { | 406 const { |
397 prerender_manager_->histograms()->RecordLocalPredictorEvent(event); | 407 UMA_HISTOGRAM_ENUMERATION( |
408 base::FieldTrial::MakeName("Prerender.LocalPredictorTimeUntilUsed", | |
409 "Prerender"), | |
410 event, PrerenderLocalPredictor::EVENT_MAX_VALUE); | |
mmenke
2012/10/12 17:59:03
This used to call RecordLocalPredictorEvent, not R
gavinp
2012/10/13 13:48:09
Indeed. Of the four histograms I moved to this fil
mmenke
2012/10/15 15:28:28
Hmm...Looks like two, to me (Which are both now fi
| |
398 } | 411 } |
399 | 412 |
400 bool PrerenderLocalPredictor::DoesPrerenderMatchPLTRecord( | 413 bool PrerenderLocalPredictor::DoesPrerenderMatchPLTRecord( |
401 PrerenderData* prerender, const GURL& url, base::TimeDelta plt) const { | 414 PrerenderData* prerender, const GURL& url, base::TimeDelta plt) const { |
402 if (prerender && prerender->start_time < GetCurrentTime() - plt) { | 415 if (prerender && prerender->start_time < GetCurrentTime() - plt) { |
403 if (prerender->url.is_empty()) | 416 if (prerender->url.is_empty()) |
404 RecordEvent(EVENT_ERROR_NO_PRERENDER_URL_FOR_PLT); | 417 RecordEvent(EVENT_ERROR_NO_PRERENDER_URL_FOR_PLT); |
405 return (prerender->url == url); | 418 return (prerender->url == url); |
406 } else { | 419 } else { |
407 return false; | 420 return false; |
408 } | 421 } |
409 } | 422 } |
410 | 423 |
411 bool PrerenderLocalPredictor::ShouldReplaceCurrentPrerender( | 424 bool PrerenderLocalPredictor::ShouldReplaceCurrentPrerender( |
412 double priority) const { | 425 double priority) const { |
413 base::TimeDelta max_age = | 426 base::TimeDelta max_age = |
414 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs); | 427 base::TimeDelta::FromMilliseconds(kMaxLocalPredictionTimeMs); |
415 return (!current_prerender_.get()) || | 428 return (!current_prerender_.get()) || |
416 current_prerender_->priority < priority || | 429 current_prerender_->priority < priority || |
417 current_prerender_->start_time < GetCurrentTime() - max_age; | 430 current_prerender_->start_time < GetCurrentTime() - max_age; |
418 } | 431 } |
419 | 432 |
420 } // namespace prerender | 433 } // namespace prerender |
OLD | NEW |