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

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

Issue 2321083002: [NoStatePrefetch] Add performance histograms. (Closed)
Patch Set: Review comments Created 4 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 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_manager_factory.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
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index 10887f9b63b0f5129c56d99a44eed3dfc98d06c1..a35543680a0d88c45da0e3d40cc092b27f9289f8 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -145,13 +145,12 @@ PrerenderManager::PrerenderManagerMode PrerenderManager::mode_ =
PRERENDER_MODE_ENABLED;
struct PrerenderManager::NavigationRecord {
- NavigationRecord(const GURL& url, base::TimeTicks time)
- : url(url),
- time(time) {
- }
+ NavigationRecord(const GURL& url, base::TimeTicks time, Origin origin)
+ : url(url), time(time), origin(origin) {}
GURL url;
base::TimeTicks time;
+ Origin origin;
};
PrerenderManager::PrerenderManager(Profile* profile)
@@ -568,6 +567,33 @@ void PrerenderManager::RecordPrefetchRedirectCount(Origin origin,
redirect_count);
}
+void PrerenderManager::RecordFirstContentfulPaint(const GURL& url,
+ bool is_no_store,
+ base::TimeDelta time) {
+ CleanUpOldNavigations(&prefetches_, base::TimeDelta::FromMinutes(30));
+
+ // Compute the prefetch age.
+ base::TimeDelta prefetch_age;
+ Origin origin = ORIGIN_NONE;
+ for (auto it = prefetches_.crbegin(); it != prefetches_.crend(); ++it) {
+ if (it->url == url) {
+ prefetch_age = GetCurrentTimeTicks() - it->time;
+ origin = it->origin;
+ break;
+ }
+ }
+
+ histograms_->RecordFirstContentfulPaint(origin, is_no_store, time,
+ prefetch_age);
+
+ // Loading a prefetched URL resets the revalidation bypass. Remove the url
+ // from the prefetch list for more accurate metrics.
+ prefetches_.erase(
+ std::remove_if(prefetches_.begin(), prefetches_.end(),
+ [url](const NavigationRecord& r) { return r.url == url; }),
+ prefetches_.end());
+}
+
// static
PrerenderManager::PrerenderManagerMode PrerenderManager::GetMode() {
return mode_;
@@ -694,7 +720,8 @@ bool PrerenderManager::HasRecentlyBeenNavigatedTo(Origin origin,
const GURL& url) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- CleanUpOldNavigations();
+ CleanUpOldNavigations(&navigations_, base::TimeDelta::FromMilliseconds(
+ kNavigationRecordWindowMs));
for (auto it = navigations_.rbegin(); it != navigations_.rend(); ++it) {
if (it->url == url) {
base::TimeDelta delta = GetCurrentTimeTicks() - it->time;
@@ -778,8 +805,9 @@ void PrerenderManager::RecordFinalStatus(Origin origin,
void PrerenderManager::RecordNavigation(const GURL& url) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- navigations_.push_back(NavigationRecord(url, GetCurrentTimeTicks()));
- CleanUpOldNavigations();
+ navigations_.emplace_back(url, GetCurrentTimeTicks(), ORIGIN_NONE);
+ CleanUpOldNavigations(&navigations_, base::TimeDelta::FromMilliseconds(
+ kNavigationRecordWindowMs));
}
struct PrerenderManager::PrerenderData::OrderByExpiryTime {
@@ -959,6 +987,9 @@ std::unique_ptr<PrerenderHandle> PrerenderManager::AddPrerender(
histograms_->RecordPrerenderStarted(origin);
DCHECK(!prerender_contents_ptr->prerendering_has_started());
+ if (prerender_contents_ptr->prerender_mode() == PREFETCH_ONLY)
+ prefetches_.emplace_back(url, GetCurrentTimeTicks(), origin);
+
std::unique_ptr<PrerenderHandle> prerender_handle =
base::WrapUnique(new PrerenderHandle(active_prerenders_.back().get()));
SortActivePrerenders();
@@ -1131,18 +1162,19 @@ void PrerenderManager::DeleteOldWebContents() {
old_web_contents_list_.clear();
}
-void PrerenderManager::CleanUpOldNavigations() {
+void PrerenderManager::CleanUpOldNavigations(
+ std::vector<NavigationRecord>* navigations,
+ base::TimeDelta max_age) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// Cutoff. Navigations before this cutoff can be discarded.
- base::TimeTicks cutoff = GetCurrentTimeTicks() -
- base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs);
- auto it = navigations_.begin();
- for (; it != navigations_.end(); ++it) {
+ base::TimeTicks cutoff = GetCurrentTimeTicks() - max_age;
+ auto it = navigations->begin();
+ for (; it != navigations->end(); ++it) {
if (it->time > cutoff)
break;
}
- navigations_.erase(navigations_.begin(), it);
+ navigations->erase(navigations->begin(), it);
}
void PrerenderManager::ScheduleDeleteOldWebContents(
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/browser/prerender/prerender_manager_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698