| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/net/predictor.h" | 5 #include "chrome/browser/net/predictor.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "net/base/host_resolver.h" | 22 #include "net/base/host_resolver.h" |
| 23 #include "net/base/net_errors.h" | 23 #include "net/base/net_errors.h" |
| 24 #include "net/base/net_log.h" | 24 #include "net/base/net_log.h" |
| 25 #include "net/base/single_request_host_resolver.h" | 25 #include "net/base/single_request_host_resolver.h" |
| 26 | 26 |
| 27 using base::TimeDelta; | 27 using base::TimeDelta; |
| 28 | 28 |
| 29 namespace chrome_browser_net { | 29 namespace chrome_browser_net { |
| 30 | 30 |
| 31 // static | 31 // static |
| 32 const int Predictor::kPredictorReferrerVersion = 2; |
| 32 const double Predictor::kPreconnectWorthyExpectedValue = 0.8; | 33 const double Predictor::kPreconnectWorthyExpectedValue = 0.8; |
| 33 // static | |
| 34 const double Predictor::kDNSPreresolutionWorthyExpectedValue = 0.1; | 34 const double Predictor::kDNSPreresolutionWorthyExpectedValue = 0.1; |
| 35 // static | |
| 36 const double Predictor::kDiscardableExpectedValue = 0.05; | 35 const double Predictor::kDiscardableExpectedValue = 0.05; |
| 37 // The goal is of trimming is to to reduce the importance (number of expected | 36 // The goal is of trimming is to to reduce the importance (number of expected |
| 38 // subresources needed) by a factor of 2 after about 24 hours of uptime. We will | 37 // subresources needed) by a factor of 2 after about 24 hours of uptime. We will |
| 39 // trim roughly once-an-hour of uptime. The ratio to use in each trim operation | 38 // trim roughly once-an-hour of uptime. The ratio to use in each trim operation |
| 40 // is then the 24th root of 0.5. If a user only surfs for 4 hours a day, then | 39 // is then the 24th root of 0.5. If a user only surfs for 4 hours a day, then |
| 41 // after about 6 days they will have halved all their estimates of subresource | 40 // after about 6 days they will have halved all their estimates of subresource |
| 42 // connections. Once this falls below kDiscardableExpectedValue the referrer | 41 // connections. Once this falls below kDiscardableExpectedValue the referrer |
| 43 // will be discarded. | 42 // will be discarded. |
| 44 // TODO(jar): Measure size of referrer lists in the field. Consider an adaptive | 43 // TODO(jar): Measure size of referrer lists in the field. Consider an adaptive |
| 45 // system that uses a higher trim ratio when the list is large. | 44 // system that uses a higher trim ratio when the list is large. |
| 46 // static | 45 // static |
| 47 const double Predictor::kReferrerTrimRatio = 0.97153; | 46 const double Predictor::kReferrerTrimRatio = 0.97153; |
| 48 | |
| 49 // static | |
| 50 const TimeDelta Predictor::kDurationBetweenTrimmings = TimeDelta::FromHours(1); | 47 const TimeDelta Predictor::kDurationBetweenTrimmings = TimeDelta::FromHours(1); |
| 51 // static | |
| 52 const TimeDelta Predictor::kDurationBetweenTrimmingIncrements = | 48 const TimeDelta Predictor::kDurationBetweenTrimmingIncrements = |
| 53 TimeDelta::FromSeconds(15); | 49 TimeDelta::FromSeconds(15); |
| 54 // static | |
| 55 const size_t Predictor::kUrlsTrimmedPerIncrement = 5u; | 50 const size_t Predictor::kUrlsTrimmedPerIncrement = 5u; |
| 56 | 51 |
| 57 class Predictor::LookupRequest { | 52 class Predictor::LookupRequest { |
| 58 public: | 53 public: |
| 59 LookupRequest(Predictor* predictor, | 54 LookupRequest(Predictor* predictor, |
| 60 net::HostResolver* host_resolver, | 55 net::HostResolver* host_resolver, |
| 61 const GURL& url) | 56 const GURL& url) |
| 62 : ALLOW_THIS_IN_INITIALIZER_LIST( | 57 : ALLOW_THIS_IN_INITIALIZER_LIST( |
| 63 net_callback_(this, &LookupRequest::OnLookupFinished)), | 58 net_callback_(this, &LookupRequest::OnLookupFinished)), |
| 64 predictor_(predictor), | 59 predictor_(predictor), |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 594 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 600 // Just finish up work if an incremental trim is in progress. | 595 // Just finish up work if an incremental trim is in progress. |
| 601 if (urls_being_trimmed_.empty()) | 596 if (urls_being_trimmed_.empty()) |
| 602 LoadUrlsForTrimming(); | 597 LoadUrlsForTrimming(); |
| 603 IncrementalTrimReferrers(true); // Do everything now. | 598 IncrementalTrimReferrers(true); // Do everything now. |
| 604 } | 599 } |
| 605 | 600 |
| 606 void Predictor::SerializeReferrers(ListValue* referral_list) { | 601 void Predictor::SerializeReferrers(ListValue* referral_list) { |
| 607 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 602 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 608 referral_list->Clear(); | 603 referral_list->Clear(); |
| 609 referral_list->Append(new base::FundamentalValue(PREDICTOR_REFERRER_VERSION)); | 604 referral_list->Append(new base::FundamentalValue(kPredictorReferrerVersion)); |
| 610 for (Referrers::const_iterator it = referrers_.begin(); | 605 for (Referrers::const_iterator it = referrers_.begin(); |
| 611 it != referrers_.end(); ++it) { | 606 it != referrers_.end(); ++it) { |
| 612 // Serialize the list of subresource names. | 607 // Serialize the list of subresource names. |
| 613 Value* subresource_list(it->second.Serialize()); | 608 Value* subresource_list(it->second.Serialize()); |
| 614 | 609 |
| 615 // Create a list for each referer. | 610 // Create a list for each referer. |
| 616 ListValue* motivator(new ListValue); | 611 ListValue* motivator(new ListValue); |
| 617 motivator->Append(new StringValue(it->first.spec())); | 612 motivator->Append(new StringValue(it->first.spec())); |
| 618 motivator->Append(subresource_list); | 613 motivator->Append(subresource_list); |
| 619 | 614 |
| 620 referral_list->Append(motivator); | 615 referral_list->Append(motivator); |
| 621 } | 616 } |
| 622 } | 617 } |
| 623 | 618 |
| 624 void Predictor::DeserializeReferrers(const ListValue& referral_list) { | 619 void Predictor::DeserializeReferrers(const ListValue& referral_list) { |
| 625 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 626 int format_version = -1; | 621 int format_version = -1; |
| 627 if (referral_list.GetSize() > 0 && | 622 if (referral_list.GetSize() > 0 && |
| 628 referral_list.GetInteger(0, &format_version) && | 623 referral_list.GetInteger(0, &format_version) && |
| 629 format_version == PREDICTOR_REFERRER_VERSION) { | 624 format_version == kPredictorReferrerVersion) { |
| 630 for (size_t i = 1; i < referral_list.GetSize(); ++i) { | 625 for (size_t i = 1; i < referral_list.GetSize(); ++i) { |
| 631 ListValue* motivator; | 626 ListValue* motivator; |
| 632 if (!referral_list.GetList(i, &motivator)) { | 627 if (!referral_list.GetList(i, &motivator)) { |
| 633 NOTREACHED(); | 628 NOTREACHED(); |
| 634 return; | 629 return; |
| 635 } | 630 } |
| 636 std::string motivating_url_spec; | 631 std::string motivating_url_spec; |
| 637 if (!motivator->GetString(0, &motivating_url_spec)) { | 632 if (!motivator->GetString(0, &motivating_url_spec)) { |
| 638 NOTREACHED(); | 633 NOTREACHED(); |
| 639 return; | 634 return; |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 // If we omit a port, it will default to 80 or 443 as appropriate. | 758 // If we omit a port, it will default to 80 or 443 as appropriate. |
| 764 std::string colon_plus_port; | 759 std::string colon_plus_port; |
| 765 if (url.has_port()) | 760 if (url.has_port()) |
| 766 colon_plus_port = ":" + url.port(); | 761 colon_plus_port = ":" + url.port(); |
| 767 | 762 |
| 768 return GURL(scheme + "://" + url.host() + colon_plus_port); | 763 return GURL(scheme + "://" + url.host() + colon_plus_port); |
| 769 } | 764 } |
| 770 | 765 |
| 771 | 766 |
| 772 } // namespace chrome_browser_net | 767 } // namespace chrome_browser_net |
| OLD | NEW |