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

Unified Diff: chrome/browser/predictors/resource_prefetch_predictor.cc

Issue 2625063002: predictors: Add ResourcePrefetchPredictor database readiness histogram. (Closed)
Patch Set: Add comments. Created 3 years, 11 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
Index: chrome/browser/predictors/resource_prefetch_predictor.cc
diff --git a/chrome/browser/predictors/resource_prefetch_predictor.cc b/chrome/browser/predictors/resource_prefetch_predictor.cc
index f333d10b6f92ae13d5899553915b79ee16ee6edd..3c5da2843d3839f01c2209d332ad2a1c35925aa5 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor.cc
@@ -13,6 +13,7 @@
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/sparse_histogram.h"
+#include "base/rand_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
@@ -56,6 +57,9 @@ const char* kFontMimeTypes[] = {"font/woff2",
"application/font-sfnt",
"application/font-ttf"};
+const size_t kNumSampleHosts = 50;
+const size_t kReportReadinessThreshold = 50;
+
// For reporting events of interest that are not tied to any navigation.
enum ReportingEvent {
REPORTING_EVENT_ALL_HISTORY_CLEARED = 0,
@@ -609,6 +613,14 @@ void ResourcePrefetchPredictor::OnNavigationComplete(
base::Bind(&ResourcePrefetchPredictor::OnVisitCountLookup,
AsWeakPtr()))),
&history_lookup_consumer_);
+
+ // Report readiness metric with 20% probability.
+ if (base::RandInt(1, 5) == 5) {
+ history_service->TopHosts(
+ kNumSampleHosts,
+ base::Bind(&ResourcePrefetchPredictor::ReportDatabaseReadiness,
+ AsWeakPtr()));
+ }
}
bool ResourcePrefetchPredictor::GetPrefetchData(const GURL& main_frame_url,
@@ -651,15 +663,8 @@ bool ResourcePrefetchPredictor::PopulatePrefetcherRequest(
size_t initial_size = urls->size();
for (const ResourceData& resource : it->second.resources()) {
- float confidence =
- static_cast<float>(resource.number_of_hits()) /
- (resource.number_of_hits() + resource.number_of_misses());
- if (confidence < config_.min_resource_confidence_to_trigger_prefetch ||
- resource.number_of_hits() <
- config_.min_resource_hits_to_trigger_prefetch)
- continue;
-
- urls->push_back(GURL(resource.resource_url()));
+ if (IsResourcePrefetchable(resource))
+ urls->push_back(GURL(resource.resource_url()));
}
return urls->size() > initial_size;
@@ -1105,6 +1110,58 @@ void ResourcePrefetchPredictor::LearnRedirect(const std::string& key,
}
}
+bool ResourcePrefetchPredictor::IsDataPrefetchable(
+ const std::string& main_frame_key,
+ const PrefetchDataMap& data_map) const {
+ PrefetchDataMap::const_iterator it = data_map.find(main_frame_key);
+ if (it == data_map.end())
+ return false;
+
+ return std::any_of(it->second.resources().begin(),
+ it->second.resources().end(),
+ [this](const ResourceData& resource) {
+ return IsResourcePrefetchable(resource);
+ });
+}
+
+bool ResourcePrefetchPredictor::IsResourcePrefetchable(
+ const ResourceData& resource) const {
+ float confidence = static_cast<float>(resource.number_of_hits()) /
+ (resource.number_of_hits() + resource.number_of_misses());
+ return confidence >= config_.min_resource_confidence_to_trigger_prefetch &&
+ resource.number_of_hits() >=
+ config_.min_resource_hits_to_trigger_prefetch;
+}
+
+void ResourcePrefetchPredictor::ReportDatabaseReadiness(
+ const history::TopHostsList& top_hosts) const {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (top_hosts.size() == 0)
+ return;
+
+ size_t count_in_cache = 0;
+ size_t total_visits = 0;
+ for (const std::pair<std::string, int>& top_host : top_hosts) {
+ const std::string& host = top_host.first;
+ total_visits += top_host.second;
+
+ // Hostnames in TopHostsLists are stripped of their 'www.' prefix. We
+ // assume that www.foo.com entry from |host_table_cache_| is also suitable
+ // for foo.com.
+ if (IsDataPrefetchable(host, *host_table_cache_) ||
+ (!base::StartsWith(host, "www.", base::CompareCase::SENSITIVE) &&
+ IsDataPrefetchable("www." + host, *host_table_cache_))) {
+ ++count_in_cache;
+ }
+ }
+
+ // Filter users that don't have the rich browsing history.
+ if (total_visits > kReportReadinessThreshold) {
+ UMA_HISTOGRAM_PERCENTAGE("ResourcePrefetchPredictor.DatabaseReadiness",
+ 100 * count_in_cache / top_hosts.size());
+ }
+}
+
void ResourcePrefetchPredictor::OnURLsDeleted(
history::HistoryService* history_service,
bool all_history,

Powered by Google App Engine
This is Rietveld 408576698