summaryrefslogtreecommitdiffstats
path: root/content/browser/loader
diff options
context:
space:
mode:
authorsimonjam@chromium.org <simonjam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-26 06:15:08 +0000
committersimonjam@chromium.org <simonjam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-26 06:15:08 +0000
commit1d5a0ba6b0fa6d611fb6c590ae35d8e2f41b8af0 (patch)
treef9b3b92ba7b74789a4cdab6e161d71ec2836d4b2 /content/browser/loader
parent2f462ed8bd8c5a2889edaf0ccad5a92b023b43d1 (diff)
downloadchromium_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.cc11
-rw-r--r--content/browser/loader/resource_scheduler_unittest.cc55
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));