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

Unified Diff: chrome/browser/prerender/prerender_manager.cc

Issue 7605020: Move prerender histograms out of prerender manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/browser/prerender/prerender_origin.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/prerender/prerender_manager.cc
===================================================================
--- chrome/browser/prerender/prerender_manager.cc (revision 96057)
+++ chrome/browser/prerender/prerender_manager.cc (working copy)
@@ -8,9 +8,8 @@
#include "base/command_line.h"
#include "base/logging.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram.h"
#include "base/stl_util.h"
+#include "base/string_util.h"
#include "base/time.h"
#include "base/values.h"
#include "base/utf_string_conversions.h"
@@ -19,6 +18,7 @@
#include "chrome/browser/prerender/prerender_condition.h"
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_final_status.h"
+#include "chrome/browser/prerender/prerender_histograms.h"
#include "chrome/browser/prerender/prerender_history.h"
#include "chrome/browser/prerender/prerender_observer.h"
#include "chrome/browser/prerender/prerender_tracker.h"
@@ -68,37 +68,6 @@
} // namespace
-// Helper macros for experiment-based and origin-based histogram reporting.
-#define PREFIXED_HISTOGRAM(histogram) \
- PREFIXED_HISTOGRAM_INTERNAL(GetCurrentOrigin(), GetCurrentExperimentId(), \
- IsOriginExperimentWash(), histogram)
-
-#define PREFIXED_HISTOGRAM_PRERENDER_MANAGER(pm, histogram) \
- PREFIXED_HISTOGRAM_INTERNAL(pm->GetCurrentOrigin(), \
- pm->GetCurrentExperimentId(), \
- pm->IsOriginExperimentWash(), histogram)
-
-#define PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(origin, experiment, histogram) \
- PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, false, histogram)
-
-#define PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, wash, histogram) { \
- static uint8 recording_experiment = kNoExperiment; \
- if (recording_experiment == kNoExperiment && experiment != kNoExperiment) \
- recording_experiment = experiment; \
- if (wash) { \
- histogram; \
- } else if (experiment != kNoExperiment && \
- (origin != ORIGIN_LINK_REL_PRERENDER || \
- experiment != recording_experiment)) { \
- } else if (experiment != kNoExperiment) { \
- histogram; \
- } else if (origin == ORIGIN_OMNIBOX) { \
- histogram; \
- } else { \
- histogram; \
- } \
-}
-
class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate {
public:
OnCloseTabContentsDeleter(PrerenderManager* manager,
@@ -203,13 +172,11 @@
profile_(profile),
prerender_tracker_(prerender_tracker),
prerender_contents_factory_(PrerenderContents::CreateFactory()),
- last_experiment_id_(kNoExperiment),
- last_origin_(ORIGIN_LINK_REL_PRERENDER),
- origin_experiment_wash_(false),
last_prerender_start_time_(GetCurrentTimeTicks() -
base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)),
runnable_method_factory_(this),
- prerender_history_(new PrerenderHistory(kHistoryLength)) {
+ prerender_history_(new PrerenderHistory(kHistoryLength)),
+ histograms_(new PrerenderHistograms()) {
// There are some assumptions that the PrerenderManager is on the UI thread.
// Any other checks simply make sure that the PrerenderManager is accessed on
// the same thread that it was created on.
@@ -253,31 +220,13 @@
const GURL& referrer) {
DCHECK(CalledOnValidThread());
- // Check if we are doing an experiment.
- uint8 experiment = GetQueryStringBasedExperiment(url_arg);
-
- // We need to update last_experiment_id_, last_origin_, and
- // origin_experiment_wash_.
- if (!WithinWindow()) {
- // If we are outside a window, this is a fresh start and we are fine,
- // and there is no mix.
- origin_experiment_wash_ = false;
- } else {
- // If we are inside the last window, there is a mish mash of origins
- // and experiments if either there was a mish mash before, or the current
- // experiment/origin does not match the previous one.
- if (experiment != last_experiment_id_ || origin != last_origin_)
- origin_experiment_wash_ = true;
+ if (origin == ORIGIN_LINK_REL_PRERENDER &&
+ StartsWithASCII(referrer.host(), std::string("www.google."), true)) {
+ origin = ORIGIN_GWS_PRERENDER;
}
- last_origin_ = origin;
- last_experiment_id_ = experiment;
+ histograms_->RecordPrerender(origin, url_arg);
- // If we observe multiple tags within the 30 second window, we will still
- // reset the window to begin at the most recent occurrence, so that we will
- // always be in a window in the 30 seconds from each occurrence.
- last_prerender_seen_time_ = GetCurrentTimeTicks();
-
// If the referring page is prerendering, defer the prerender.
if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
prerender_list_.end()) {
@@ -297,6 +246,8 @@
if (FindEntry(url))
return false;
+ uint8 experiment = GetQueryStringBasedExperiment(url_arg);
+
// Do not prerender if there are too many render processes, and we would
// have to use an existing one. We do not want prerendering to happen in
// a shared process, so that we can always reliably lower the CPU
@@ -511,13 +462,13 @@
if (!prerender_tracker_->TryUse(child_id, route_id))
return false;
- if (!prerender_contents->load_start_time().is_null())
- RecordTimeUntilUsed(GetCurrentTimeTicks() -
- prerender_contents->load_start_time());
+ if (!prerender_contents->load_start_time().is_null()) {
+ histograms_->RecordTimeUntilUsed(GetCurrentTimeTicks() -
+ prerender_contents->load_start_time(),
+ config_.max_age);
+ }
- PREFIXED_HISTOGRAM(UMA_HISTOGRAM_COUNTS(
- GetDefaultHistogramName("PrerendersPerSessionCount"),
- ++prerenders_per_session_count_));
+ histograms_->RecordPerSessionCount(++prerenders_per_session_count_);
prerender_contents->set_final_status(FINAL_STATUS_USED);
RenderViewHost* render_view_host =
@@ -656,18 +607,6 @@
}
}
-// Helper macro for histograms.
-#define RECORD_PLT(tag, perceived_page_load_time) { \
- PREFIXED_HISTOGRAM_PRERENDER_MANAGER(prerender_manager, \
- UMA_HISTOGRAM_CUSTOM_TIMES( \
- base::FieldTrial::MakeName( \
- prerender_manager->GetDefaultHistogramName(tag), "Prefetch"), \
- perceived_page_load_time, \
- base::TimeDelta::FromMilliseconds(10), \
- base::TimeDelta::FromSeconds(60), \
- 100)); \
-}
-
// static
void PrerenderManager::RecordPerceivedPageLoadTime(
base::TimeDelta perceived_page_load_time,
@@ -680,20 +619,13 @@
return;
if (!prerender_manager->is_enabled())
return;
- bool within_window = prerender_manager->WithinWindow();
- RECORD_PLT("PerceivedPLT", perceived_page_load_time);
- if (within_window)
- RECORD_PLT("PerceivedPLTWindowed", perceived_page_load_time);
- if (prerender_manager &&
+ bool was_prerender =
((mode_ == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP &&
prerender_manager->WouldTabContentsBePrerendered(tab_contents)) ||
(mode_ == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP &&
- prerender_manager->IsTabContentsPrerendered(tab_contents)))) {
- RECORD_PLT("PerceivedPLTMatched", perceived_page_load_time);
- } else {
- if (within_window)
- RECORD_PLT("PerceivedPLTWindowNotMatched", perceived_page_load_time);
- }
+ prerender_manager->IsTabContentsPrerendered(tab_contents)));
+ prerender_manager->histograms_->RecordPerceivedPageLoadTime(
+ perceived_page_load_time, was_prerender);
}
bool PrerenderManager::is_enabled() const {
@@ -766,23 +698,11 @@
}
}
-bool PrerenderManager::WithinWindow() const {
- DCHECK(CalledOnValidThread());
- if (last_prerender_seen_time_.is_null())
- return false;
- base::TimeDelta elapsed_time =
- base::TimeTicks::Now() - last_prerender_seen_time_;
- return elapsed_time <= base::TimeDelta::FromSeconds(kWindowDurationSeconds);
-}
-
bool PrerenderManager::DoesRateLimitAllowPrerender() const {
DCHECK(CalledOnValidThread());
base::TimeDelta elapsed_time =
GetCurrentTimeTicks() - last_prerender_start_time_;
- PREFIXED_HISTOGRAM(
- UMA_HISTOGRAM_TIMES(
- GetDefaultHistogramName("TimeBetweenPrerenderRequests"),
- elapsed_time));
+ histograms_->RecordTimeBetweenPrerenderRequests(elapsed_time);
if (!config_.rate_limit_enabled)
return true;
return elapsed_time >
@@ -1021,89 +941,10 @@
DeletePendingDeleteEntries();
}
-void PrerenderManager::RecordTimeUntilUsed(base::TimeDelta time_until_used) {
- DCHECK(CalledOnValidThread());
- PREFIXED_HISTOGRAM(UMA_HISTOGRAM_CUSTOM_TIMES(
- GetDefaultHistogramName("TimeUntilUsed"),
- time_until_used,
- base::TimeDelta::FromMilliseconds(10),
- config_.max_age,
- 50));
-}
-
void PrerenderManager::RecordFinalStatus(Origin origin,
uint8 experiment_id,
FinalStatus final_status) const {
- DCHECK(final_status != FINAL_STATUS_MAX);
- // FINAL_STATUS_CONTROL_GROUP indicates that the PrerenderContents
- // was created only to measure "would-have-been-prerendered" for
- // control group measurements. Don't pollute data with it.
- if (PrerenderManager::IsControlGroup() ||
- final_status == FINAL_STATUS_CONTROL_GROUP)
- return;
- PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(origin, experiment_id,
- UMA_HISTOGRAM_ENUMERATION(
- GetHistogramName(origin, experiment_id, "FinalStatus"),
- final_status,
- FINAL_STATUS_MAX));
+ histograms_->RecordFinalStatus(origin, experiment_id, final_status);
}
-std::string PrerenderManager::ComposeHistogramName(
- const std::string& prefix_type,
- const std::string& name) const {
- if (prefix_type.empty())
- return std::string("Prerender.") + name;
- return std::string("Prerender.") + prefix_type + std::string("_") + name;
-}
-
-std::string PrerenderManager::GetHistogramName(Origin origin,
- uint8 experiment_id,
- const std::string& name) const {
- switch (origin) {
- case ORIGIN_OMNIBOX:
- if (experiment_id != kNoExperiment)
- return ComposeHistogramName("wash", name);
- return ComposeHistogramName("omnibox", name);
- case ORIGIN_LINK_REL_PRERENDER:
- if (experiment_id == kNoExperiment)
- return ComposeHistogramName("", name);
- return ComposeHistogramName("exp" + std::string(1, experiment_id + '0'),
- name);
- default:
- NOTREACHED();
- break;
- };
-
- // Dummy return value to make the compiler happy.
- NOTREACHED();
- return ComposeHistogramName("wash", name);
-}
-
-std::string PrerenderManager::GetDefaultHistogramName(
- const std::string& name) const {
- if (!WithinWindow())
- return ComposeHistogramName("", name);
- if (origin_experiment_wash_)
- return ComposeHistogramName("wash", name);
- return GetHistogramName(last_origin_, last_experiment_id_, name);
-}
-
-uint8 PrerenderManager::GetCurrentExperimentId() const {
- if (!WithinWindow())
- return kNoExperiment;
- return last_experiment_id_;
-}
-
-Origin PrerenderManager::GetCurrentOrigin() const {
- if (!WithinWindow())
- return ORIGIN_LINK_REL_PRERENDER;
- return last_origin_;
-}
-
-bool PrerenderManager::IsOriginExperimentWash() const {
- if (!WithinWindow())
- return false;
- return origin_experiment_wash_;
-}
-
} // namespace prerender
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/browser/prerender/prerender_origin.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698