diff options
author | simonjam@chromium.org <simonjam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-26 06:15:08 +0000 |
---|---|---|
committer | simonjam@chromium.org <simonjam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-26 06:15:08 +0000 |
commit | 1d5a0ba6b0fa6d611fb6c590ae35d8e2f41b8af0 (patch) | |
tree | f9b3b92ba7b74789a4cdab6e161d71ec2836d4b2 /content/browser/loader | |
parent | 2f462ed8bd8c5a2889edaf0ccad5a92b023b43d1 (diff) | |
download | chromium_src-1d5a0ba6b0fa6d611fb6c590ae35d8e2f41b8af0.zip chromium_src-1d5a0ba6b0fa6d611fb6c590ae35d8e2f41b8af0.tar.gz chromium_src-1d5a0ba6b0fa6d611fb6c590ae35d8e2f41b8af0.tar.bz2 |
Load one image at a time prior to parsing the <body>.
This is a noticeable improvement:
- 1.6% Speed Index
- 1% onload
The improvement even more profound in the long tail:
- 8.7% Speed Index
- 10% onload
The cost is a 2% hit to DOMContentLoaded only seen above the 95th
percentile.
BUG=254179
Review URL: https://chromiumcodereview.appspot.com/17750003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208651 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/loader')
-rw-r--r-- | content/browser/loader/resource_scheduler.cc | 11 | ||||
-rw-r--r-- | content/browser/loader/resource_scheduler_unittest.cc | 55 |
2 files changed, 45 insertions, 21 deletions
diff --git a/content/browser/loader/resource_scheduler.cc b/content/browser/loader/resource_scheduler.cc index 6e75c73..7e70c45 100644 --- a/content/browser/loader/resource_scheduler.cc +++ b/content/browser/loader/resource_scheduler.cc @@ -313,7 +313,12 @@ size_t ResourceScheduler::GetNumDelayableRequestsInFlight( for (RequestSet::iterator it = client->in_flight_requests.begin(); it != client->in_flight_requests.end(); ++it) { if ((*it)->url_request()->priority() < net::LOW) { - ++count; + const net::HttpServerProperties& http_server_properties = + *(*it)->url_request()->context()->http_server_properties(); + if (!http_server_properties.SupportsSpdy( + net::HostPortPair::FromURL((*it)->url_request()->url()))) { + ++count; + } } } return count; @@ -335,6 +340,7 @@ size_t ResourceScheduler::GetNumDelayableRequestsInFlight( // requests. // * Once the renderer has a <body>, start loading delayable requests. // * Never exceed 10 delayable requests in flight per client. +// * Prior to <body>, allow one delayable request to load at a time. bool ResourceScheduler::ShouldStartRequest(ScheduledResourceRequest* request, Client* client) const { const net::URLRequest& url_request = *request->url_request(); @@ -361,7 +367,8 @@ bool ResourceScheduler::ShouldStartRequest(ScheduledResourceRequest* request, bool have_immediate_requests_in_flight = client->in_flight_requests.size() > num_delayable_requests_in_flight; - if (have_immediate_requests_in_flight && !client->has_body) { + if (have_immediate_requests_in_flight && !client->has_body && + num_delayable_requests_in_flight != 0) { return false; } diff --git a/content/browser/loader/resource_scheduler_unittest.cc b/content/browser/loader/resource_scheduler_unittest.cc index cfaf459..a2adb147 100644 --- a/content/browser/loader/resource_scheduler_unittest.cc +++ b/content/browser/loader/resource_scheduler_unittest.cc @@ -213,36 +213,42 @@ TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) { EXPECT_TRUE(request->started()); } -TEST_F(ResourceSchedulerTest, LowBlocksUntilIdle) { +TEST_F(ResourceSchedulerTest, OneLowLoadsUntilIdle) { scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); - EXPECT_FALSE(low->started()); - high.reset(); EXPECT_TRUE(low->started()); + EXPECT_FALSE(low2->started()); + high.reset(); + EXPECT_TRUE(low2->started()); } -TEST_F(ResourceSchedulerTest, LowBlocksUntilBodyInserted) { +TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInserted) { scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); - EXPECT_FALSE(low->started()); - scheduler_.OnWillInsertBody(kChildId, kRouteId); EXPECT_TRUE(low->started()); + EXPECT_FALSE(low2->started()); + scheduler_.OnWillInsertBody(kChildId, kRouteId); + EXPECT_TRUE(low2->started()); } -TEST_F(ResourceSchedulerTest, LowBlocksUntilBodyInsertedExceptSpdy) { +TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { http_server_properties_.SetSupportsSpdy( net::HostPortPair("spdyhost", 443), true); scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); scoped_ptr<TestRequest> low_spdy( NewRequest("https://spdyhost/high", net::LOWEST)); scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); EXPECT_TRUE(low_spdy->started()); - EXPECT_FALSE(low->started()); - scheduler_.OnWillInsertBody(kChildId, kRouteId); EXPECT_TRUE(low->started()); + EXPECT_FALSE(low2->started()); + scheduler_.OnWillInsertBody(kChildId, kRouteId); + EXPECT_TRUE(low2->started()); } TEST_F(ResourceSchedulerTest, NavigationResetsState) { @@ -250,8 +256,10 @@ TEST_F(ResourceSchedulerTest, NavigationResetsState) { scheduler_.OnNavigate(kChildId, kRouteId); scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high->started()); - EXPECT_FALSE(low->started()); + EXPECT_TRUE(low->started()); + EXPECT_FALSE(low2->started()); } TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) { @@ -261,17 +269,19 @@ TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) { EXPECT_TRUE(request->started()); } -TEST_F(ResourceSchedulerTest, StartRequestsWhenIdle) { +TEST_F(ResourceSchedulerTest, StartMultipleLowRequestsWhenIdle) { scoped_ptr<TestRequest> high1(NewRequest("http://host/high1", net::HIGHEST)); scoped_ptr<TestRequest> high2(NewRequest("http://host/high2", net::HIGHEST)); scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); + scoped_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); EXPECT_TRUE(high1->started()); EXPECT_TRUE(high2->started()); - EXPECT_FALSE(low->started()); + EXPECT_TRUE(low->started()); + EXPECT_FALSE(low2->started()); high1.reset(); - EXPECT_FALSE(low->started()); + EXPECT_FALSE(low2->started()); high2.reset(); - EXPECT_TRUE(low->started()); + EXPECT_TRUE(low2->started()); } TEST_F(ResourceSchedulerTest, CancelOtherRequestsWhileResuming) { @@ -323,8 +333,9 @@ TEST_F(ResourceSchedulerTest, LimitedNumberOfDelayableRequestsInFlight) { } TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) { - // Dummy to enforce scheduling. + // Dummies to enforce scheduling. scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); + scoped_ptr<TestRequest> low(NewRequest("http://host/req", net::LOWEST)); scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); EXPECT_FALSE(request->started()); @@ -334,8 +345,9 @@ TEST_F(ResourceSchedulerTest, RaisePriorityAndStart) { } TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) { - // Dummy to enforce scheduling. + // Dummies to enforce scheduling. scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); + scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::IDLE)); scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); @@ -359,8 +371,9 @@ TEST_F(ResourceSchedulerTest, RaisePriorityInQueue) { } TEST_F(ResourceSchedulerTest, LowerPriority) { - // Dummy to enforce scheduling. + // Dummies to enforce scheduling. scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); + scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOWEST)); scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); @@ -372,8 +385,11 @@ TEST_F(ResourceSchedulerTest, LowerPriority) { EXPECT_FALSE(idle->started()); const int kMaxNumDelayableRequestsPerClient = 10; // Should match the .cc. + // 2 fewer filler requests: 1 for the "low" dummy at the start, and 1 for the + // one at the end, which will be tested. + const int kNumFillerRequests = kMaxNumDelayableRequestsPerClient - 2; ScopedVector<TestRequest> lows; - for (int i = 0; i < kMaxNumDelayableRequestsPerClient - 1; ++i) { + for (int i = 0; i < kNumFillerRequests; ++i) { string url = "http://host/low" + base::IntToString(i); lows.push_back(NewRequest(url.c_str(), net::LOWEST)); } @@ -384,8 +400,9 @@ TEST_F(ResourceSchedulerTest, LowerPriority) { } TEST_F(ResourceSchedulerTest, ReprioritizedRequestGoesToBackOfQueue) { - // Dummy to enforce scheduling. + // Dummies to enforce scheduling. scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST)); + scoped_ptr<TestRequest> low(NewRequest("http://host/high", net::LOWEST)); scoped_ptr<TestRequest> request(NewRequest("http://host/req", net::LOWEST)); scoped_ptr<TestRequest> idle(NewRequest("http://host/idle", net::IDLE)); |