diff options
author | eblake@chromium.org <eblake@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-27 22:27:09 +0000 |
---|---|---|
committer | eblake@chromium.org <eblake@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-27 22:27:09 +0000 |
commit | 4052d8b104b7705777510dda5202ae23dffbb724 (patch) | |
tree | a5aa8d8aea3fe30fcb45a2c5ef4d23cf8c19934a /chrome/renderer | |
parent | 077ad2b18470cd7af56bf2e1226f00f713a08d76 (diff) | |
download | chromium_src-4052d8b104b7705777510dda5202ae23dffbb724.zip chromium_src-4052d8b104b7705777510dda5202ae23dffbb724.tar.gz chromium_src-4052d8b104b7705777510dda5202ae23dffbb724.tar.bz2 |
Merge 37244 - Separate out pageloadtimes to distinguish reload etc.
from navigation
We now have 4 categories, and we gather histogram for each
of those categories.
In addition, I transitioned all the A/B experiments to use
the data only when a "real" navigation takes place, and not
when a reload or back/forward is instigated.
BUG=33229
r=darin
Review URL: http://codereview.chromium.org/555109
TBR=jar@chromium.org
Review URL: http://codereview.chromium.org/552201
git-svn-id: svn://svn.chromium.org/chrome/branches/307/src@37331 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/navigation_state.h | 15 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 205 |
2 files changed, 144 insertions, 76 deletions
diff --git a/chrome/renderer/navigation_state.h b/chrome/renderer/navigation_state.h index 61f63ac..12580f8 100644 --- a/chrome/renderer/navigation_state.h +++ b/chrome/renderer/navigation_state.h @@ -18,6 +18,15 @@ // WebDataSource (see RenderView::DidCreateDataSource). class NavigationState : public WebKit::WebDataSource::ExtraData { public: + enum LoadType { + UNDEFINED_LOAD, // Not yet initialized. + RELOAD, // User pressed reload. + HISTORY_LOAD, // Back or forward. + NORMAL_LOAD, // User entered URL, or omnibox search. + LINK_LOAD, // Includes links, submits, location.reload(). + LOAD_TYPE_MAX // Bounding value for this enum. + }; + static NavigationState* CreateBrowserInitiated( int32 pending_page_id, PageTransition::Type transition_type, @@ -52,6 +61,10 @@ class NavigationState : public WebKit::WebDataSource::ExtraData { transition_type_ = type; } + // Record the nature of this load, for use when histogramming page load times. + LoadType load_type() const { return load_type_; } + void set_load_type(LoadType load_type) { load_type_ = load_type; } + // The time that this navigation was requested. const base::Time& request_time() const { return request_time_; @@ -200,6 +213,7 @@ class NavigationState : public WebKit::WebDataSource::ExtraData { bool is_content_initiated, int32 pending_page_id) : transition_type_(transition_type), + load_type_(UNDEFINED_LOAD), request_time_(request_time), load_histograms_recorded_(false), request_committed_(false), @@ -213,6 +227,7 @@ class NavigationState : public WebKit::WebDataSource::ExtraData { } PageTransition::Type transition_type_; + LoadType load_type_; base::Time request_time_; base::Time start_load_time_; base::Time commit_load_time_; diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 7c9176d6..8a718db 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -842,15 +842,21 @@ void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) { pending_navigation_state_.reset(state); } + NavigationState* navigation_state = pending_navigation_state_.get(); + // If we are reloading, then WebKit will use the history state of the current // page, so we should just ignore any given history state. Otherwise, if we // have history state, then we need to navigate to it, which corresponds to a // back/forward navigation event. if (is_reload) { + if (navigation_state) + navigation_state->set_load_type(NavigationState::RELOAD); main_frame->reload(); } else if (!params.state.empty()) { // We must know the page ID of the page we are navigating back to. DCHECK_NE(params.page_id, -1); + if (navigation_state) + navigation_state->set_load_type(NavigationState::HISTORY_LOAD); main_frame->loadHistoryItem( webkit_glue::HistoryItemFromString(params.state)); } else { @@ -868,6 +874,8 @@ void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) { WebString::fromUTF8(params.referrer.spec())); } + if (navigation_state) + navigation_state->set_load_type(NavigationState::NORMAL_LOAD); main_frame->loadRequest(request); } @@ -2182,9 +2190,15 @@ void RenderView::didCompleteClientRedirect( void RenderView::didCreateDataSource(WebFrame* frame, WebDataSource* ds) { // The rest of RenderView assumes that a WebDataSource will always have a // non-null NavigationState. - NavigationState* state = pending_navigation_state_.get() ? - pending_navigation_state_.release() : - NavigationState::CreateContentInitiated(); + bool content_initiated = !pending_navigation_state_.get(); + NavigationState* state = content_initiated ? + NavigationState::CreateContentInitiated() : + pending_navigation_state_.release(); + // TODO(jar): We may need to split up LINK_LOAD into several categories, based + // on cache policy (not that location.reload() forces cache to be avoided). + // Without the distinction, the distribution may be significantly bimodal. + if (content_initiated) + state->set_load_type(NavigationState::LINK_LOAD); state->set_user_script_idle_scheduler( new UserScriptIdleScheduler(this, frame)); @@ -3084,10 +3098,10 @@ std::string RenderView::DetermineTextLanguage(const std::wstring& text) { &num_languages, NULL); if (cld_language != NUM_LANGUAGES && cld_language != UNKNOWN_LANGUAGE && cld_language != TG_UNKNOWN_LANGUAGE) { - // We should not use LanguageCode_ISO_639_1 because it does not cover all the - // languages CLD can detect. As a result, it'll return the invalid language - // code for tradtional Chinese among others. |LanguageCode| will go through - // ISO 639-1, ISO-639-2 and 'other' tables to do the 'right' thing. + // We should not use LanguageCode_ISO_639_1 because it does not cover all + // the languages CLD can detect. As a result, it'll return the invalid + // language code for tradtional Chinese among others. |LanguageCode| will go + // through ISO 639-1, ISO-639-2 and 'other' tables to do the 'right' thing. language = LanguageCode(cld_language); } return language; @@ -3729,6 +3743,10 @@ void RenderView::DumpLoadHistograms() const { LogNavigationState(navigation_state, main_frame->dataSource()); + NavigationState::LoadType load_type = navigation_state->load_type(); + UMA_HISTOGRAM_ENUMERATION("Renderer4.LoadType", load_type, + NavigationState::LOAD_TYPE_MAX); + Time request = navigation_state->request_time(); Time start = navigation_state->start_load_time(); Time commit = navigation_state->commit_load_time(); @@ -3752,96 +3770,128 @@ void RenderView::DumpLoadHistograms() const { "Renderer4.FinishDocToFinish", finish - finish_doc); UMA_HISTOGRAM_MEDIUM_TIMES("Renderer4.BeginToCommit", commit - begin); - UMA_HISTOGRAM_MEDIUM_TIMES("Renderer4.BeginToFinishDoc", finish_doc - begin); - - static const TimeDelta kBeginToFinishMin(TimeDelta::FromMilliseconds(10)); - static const TimeDelta kBeginToFinishMax(TimeDelta::FromMinutes(10)); - static const size_t kBeginToFinishBucketCount(100); - UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.BeginToFinish", - finish - begin, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.StartToFinish", - finish - start, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - if (!request.is_null()) - UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.RequestToFinish", - finish - request, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); + static const TimeDelta kBeginToFinishDocMin(TimeDelta::FromMilliseconds(10)); + static const TimeDelta kBeginToFinishDocMax(TimeDelta::FromMinutes(10)); + static const size_t kBeginToFinishDocBucketCount(100); + + TimeDelta begin_to_finish_doc = finish_doc - begin; + UMA_HISTOGRAM_MEDIUM_TIMES("Renderer4.BeginToFinishDoc", begin_to_finish_doc); + switch (load_type) { + case NavigationState::UNDEFINED_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.BeginToFinishDoc_UndefLoad", + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + case NavigationState::RELOAD: + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.BeginToFinishDoc_Reload", + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + case NavigationState::HISTORY_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.BeginToFinishDoc_HistoryLoad", + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + case NavigationState::NORMAL_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.BeginToFinishDoc_NormalLoad", + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + case NavigationState::LINK_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.BeginToFinishDoc_LinkLoad", + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + default: + break; + } static bool use_dns_histogram(FieldTrialList::Find("DnsImpact") && !FieldTrialList::Find("DnsImpact")->group_name().empty()); if (use_dns_histogram) { - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.BeginToFinish", "DnsImpact").data(), - finish - begin, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.StartToFinish", "DnsImpact").data(), - finish - start, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - if (!request.is_null()) - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.RequestToFinish", "DnsImpact").data(), - finish - request, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); + switch (load_type) { + case NavigationState::NORMAL_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName( + "Renderer4.BeginToFinishDoc_NormalLoad", "DnsImpact"), + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + case NavigationState::LINK_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName( + "Renderer4.BeginToFinishDoc_LinkLoad", "DnsImpact"), + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + default: + break; + } } static bool use_sdch_histogram(FieldTrialList::Find("GlobalSdch") && !FieldTrialList::Find("GlobalSdch")->group_name().empty()); if (use_sdch_histogram) { - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.BeginToFinish", "GlobalSdch").data(), - finish - begin, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.StartToFinish", "GlobalSdch").data(), - finish - start, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - if (!request.is_null()) - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.RequestToFinish", - "GlobalSdch").data(), - finish - request, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); + switch (load_type) { + case NavigationState::NORMAL_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName( + "Renderer4.BeginToFinishDoc_NormalLoad", "GlobalSdch"), + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + case NavigationState::LINK_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName( + "Renderer4.BeginToFinishDoc_LinkLoad", "GlobalSdch"), + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + default: + break; + } } static bool use_socket_late_binding_histogram = FieldTrialList::Find("SocketLateBinding") && !FieldTrialList::Find("SocketLateBinding")->group_name().empty(); if (use_socket_late_binding_histogram) { - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.BeginToFinish", - "SocketLateBinding").data(), - finish - begin, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.StartToFinish", - "SocketLateBinding").data(), - finish - start, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); - if (!request.is_null()) - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.RequestToFinish", - "SocketLateBinding").data(), - finish - request, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); + switch (load_type) { + case NavigationState::NORMAL_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName( + "Renderer4.BeginToFinishDoc_NormalLoad", "SocketLateBinding"), + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + case NavigationState::LINK_LOAD: + UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName( + "Renderer4.BeginToFinishDoc_LinkLoad", "SocketLateBinding"), + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); + break; + default: + break; + } } static bool use_cache_histogram1(FieldTrialList::Find("CacheSize") && !FieldTrialList::Find("CacheSize")->group_name().empty()); - if (use_cache_histogram1) - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.StartToFinish", "CacheSize").data(), - finish - start, kBeginToFinishMin, - kBeginToFinishMax, kBeginToFinishBucketCount); + if (use_cache_histogram1 && NavigationState::LINK_LOAD == load_type) + UMA_HISTOGRAM_CUSTOM_TIMES(FieldTrial::MakeName( + "Renderer4.BeginToFinishDoc_LinkLoad", "CacheSize"), + begin_to_finish_doc, kBeginToFinishDocMin, kBeginToFinishDocMax, + kBeginToFinishDocBucketCount); - static bool use_cache_histogram2(FieldTrialList::Find("NewEviction") && - !FieldTrialList::Find("NewEviction")->group_name().empty()); - if (use_cache_histogram2) - UMA_HISTOGRAM_CUSTOM_TIMES( - FieldTrial::MakeName("Renderer4.StartToFinish", "NewEviction").data(), - finish - start, kBeginToFinishMin, + static const TimeDelta kBeginToFinishMin(TimeDelta::FromMilliseconds(10)); + static const TimeDelta kBeginToFinishMax(TimeDelta::FromMinutes(10)); + static const size_t kBeginToFinishBucketCount(100); + + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.BeginToFinish", + finish - begin, kBeginToFinishMin, + kBeginToFinishMax, kBeginToFinishBucketCount); + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.StartToFinish", + finish - start, kBeginToFinishMin, + kBeginToFinishMax, kBeginToFinishBucketCount); + if (!request.is_null()) + UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.RequestToFinish", + finish - request, kBeginToFinishMin, kBeginToFinishMax, kBeginToFinishBucketCount); UMA_HISTOGRAM_MEDIUM_TIMES("Renderer4.CommitToFinish", finish - commit); @@ -3871,6 +3921,9 @@ void RenderView::DumpLoadHistograms() const { // the histograms we generated. Without this call, pages that don't have an // on-close-handler might generate data that is lost when the renderer is // shutdown abruptly (perchance because the user closed the tab). + // TODO(jar) BUG=33233: This needs to be moved to a PostDelayedTask, and it + // should post when the onload is complete, so that it doesn't interfere with + // the next load. if (RenderThread::current()) { RenderThread::current()->SendHistograms( HistogramSynchronizer::kReservedSequenceNumber); |