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

Side by Side Diff: cc/resources/resource_pool_unittest.cc

Issue 1410833005: Test multideque (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@resource_evict_fix
Patch Set: Added traces to compute cost of functions. Created 5 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « cc/resources/resource_pool.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "cc/resources/resource_pool.h" 5 #include "cc/resources/resource_pool.h"
6 6
7 #include <iostream>
8 #include <map>
9
7 #include "base/run_loop.h" 10 #include "base/run_loop.h"
8 #include "base/thread_task_runner_handle.h" 11 #include "base/thread_task_runner_handle.h"
9 #include "cc/resources/resource_util.h" 12 #include "cc/resources/resource_util.h"
10 #include "cc/resources/scoped_resource.h" 13 #include "cc/resources/scoped_resource.h"
11 #include "cc/test/fake_output_surface.h" 14 #include "cc/test/fake_output_surface.h"
12 #include "cc/test/fake_output_surface_client.h" 15 #include "cc/test/fake_output_surface_client.h"
13 #include "cc/test/fake_resource_provider.h" 16 #include "cc/test/fake_resource_provider.h"
14 #include "cc/test/test_shared_bitmap_manager.h" 17 #include "cc/test/test_shared_bitmap_manager.h"
15 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
16 19
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 // released within 100 ms, give the thread up to 200. 214 // released within 100 ms, give the thread up to 200.
212 base::RunLoop run_loop; 215 base::RunLoop run_loop;
213 task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), 216 task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(),
214 base::TimeDelta::FromMillisecondsD(200)); 217 base::TimeDelta::FromMillisecondsD(200));
215 run_loop.Run(); 218 run_loop.Run();
216 219
217 EXPECT_EQ(0u, resource_provider_->num_resources()); 220 EXPECT_EQ(0u, resource_provider_->num_resources());
218 EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting()); 221 EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting());
219 } 222 }
220 223
224 struct TestResource {
225 explicit TestResource(const gfx::Size& size) { this->size = size; }
226
227 gfx::Size size;
228 // uint64_t content_id;
229 };
230
231 class TestDeque {
232 public:
233 TestResource* Acquire(const gfx::Size& size) {
234 TestResource* resource = nullptr;
235 for (DQ::iterator it = unused_.begin(); it != unused_.end(); ++it) {
236 resource = *it;
237 if (resource->size == size)
238 return resource;
danakj 2015/11/09 19:32:51 don't you need to erase from from unused_ here?
prashant.n 2015/11/10 04:10:50 No. Basically test is - 1. create n resources 2.
danakj 2015/11/10 22:12:05 But the actual acquire does erase.
239 }
240
241 return new TestResource(size);
242 }
243
244 void AppendToUnused(TestResource* resource) { unused_.push_front(resource); }
245
246 void RemoveAll() {
247 for (DQ::iterator it = unused_.begin(); it != unused_.end(); ++it) {
248 delete *it;
249 }
250 unused_.clear();
251 }
252
253 private:
254 typedef std::deque<TestResource*> DQ;
255 DQ unused_;
256 };
257
258 class TestMultiDeque {
259 public:
260 TestResource* Acquire(const gfx::Size& size) {
261 TestResource* resource = nullptr;
262 Key key = std::make_pair(size.width(), size.height());
263 DQM::iterator kit = unused_.find(key);
264
265 if (kit != unused_.end()) {
266 DQ* dq = kit->second;
267
268 for (DQ::iterator it = dq->begin(); it != dq->end(); ++it) {
269 resource = *it;
270 if (resource->size == size)
271 return resource;
danakj 2015/11/09 19:32:51 and erase from dq and possibly from unused_ here?
272 }
273 }
274
275 return new TestResource(size);
276 }
277
278 void AppendToUnused(TestResource* resource) {
279 Key key = std::make_pair(resource->size.width(), resource->size.height());
280 DQM::iterator kit = unused_.find(key);
281 if (kit != unused_.end()) {
282 DQ* dq = kit->second;
283 dq->push_front(resource);
284 } else {
285 DQ* dq = new DQ;
286 dq->push_front(resource);
287 unused_[key] = dq;
288 }
289 }
290
291 void RemoveAll() {
292 for (DQM::iterator kit = unused_.begin(); kit != unused_.end(); ++kit) {
293 DQ* dq = kit->second;
294 for (DQ::iterator it = dq->begin(); it != dq->end(); ++it) {
295 delete *it;
296 }
297 delete dq;
298 }
299 unused_.clear();
300 }
301
302 private:
303 typedef std::pair<int, int> Key;
304 typedef std::deque<TestResource*> DQ;
305 typedef std::map<Key, DQ*> DQM;
306 DQM unused_;
307 };
308
309 void RunTestDeque(int how_many, int tile_round_up, int tile_size_max) {
310 TestDeque tdq;
311 gfx::Size size;
312 int rounds = tile_size_max / tile_round_up;
313 const int r_max = rounds * rounds * how_many;
314 TestResource* resource[r_max];
315
316 int i = 0;
317 for (int w = tile_round_up; w <= tile_size_max; w += tile_round_up) {
318 for (int h = tile_round_up; h <= tile_size_max; h += tile_round_up) {
319 size = gfx::Size(w, h);
320 for (int j = 0; j < how_many; ++j)
321 resource[i++] = tdq.Acquire(size);
322 }
323 }
324
325 for (int i = 0; i < r_max; ++i)
326 tdq.AppendToUnused(resource[i]);
danakj 2015/11/09 19:32:51 Your results appear to include the cost of creatin
prashant.n 2015/11/10 04:10:50 It was not intentional. I thought creating and app
327
328 size = gfx::Size(1024, 1024);
329 for (int k = 0; k < 1000000; ++k) {
330 TestResource* r = tdq.Acquire(size);
331 delete r;
332 }
333
334 tdq.RemoveAll();
335 }
336
337 void RunTestMultiDeque(int how_many, int tile_round_up, int tile_size_max) {
338 TestMultiDeque tdq;
339 gfx::Size size;
340 int rounds = tile_size_max / tile_round_up;
341 const int r_max = rounds * rounds * how_many;
342 TestResource* resource[r_max];
343
344 int i = 0;
345 for (int w = tile_round_up; w <= tile_size_max; w += tile_round_up) {
346 for (int h = tile_round_up; h <= tile_size_max; h += tile_round_up) {
347 size = gfx::Size(w, h);
348 for (int j = 0; j < how_many; ++j)
349 resource[i++] = tdq.Acquire(size);
350 }
351 }
352
353 for (int i = 0; i < r_max; ++i)
354 tdq.AppendToUnused(resource[i]);
355
356 size = gfx::Size(1024, 1024);
357 for (int k = 0; k < 1000000; ++k) {
358 TestResource* r = tdq.Acquire(size);
359 delete r;
360 }
361
362 tdq.RemoveAll();
363 }
364
365 TEST_F(ResourcePoolTest, TestDequeSingle) {
366 RunTestDeque(1, 64, 64);
367 }
368
369 TEST_F(ResourcePoolTest, TestMultiDequeSingle) {
370 RunTestMultiDeque(1, 64, 64);
371 }
372
373 TEST_F(ResourcePoolTest, TestDequeManyOfOneSize) {
374 RunTestDeque(50, 64, 64);
375 }
376
377 TEST_F(ResourcePoolTest, TestMultiDequeManyOfOneSize) {
378 RunTestMultiDeque(50, 64, 64);
379 }
380
381 TEST_F(ResourcePoolTest, TestDequeOneOfEachSize) {
382 RunTestDeque(1, 64, 512);
383 }
384
385 TEST_F(ResourcePoolTest, TestMultiDequeOneOfEachSize) {
386 RunTestMultiDeque(1, 64, 512);
387 }
388
389 TEST_F(ResourcePoolTest, TestDequeManyOfEachSize) {
390 RunTestDeque(5, 64, 512);
391 }
392
393 TEST_F(ResourcePoolTest, TestMultiDequeManyOfEachSize) {
394 RunTestMultiDeque(5, 64, 512);
395 }
396
397 TEST_F(ResourcePoolTest, TestDequeTooManyOfEachSize) {
398 RunTestDeque(20, 64, 512);
399 }
400
401 TEST_F(ResourcePoolTest, TestMultiDequeTooManyOfEachSize) {
402 RunTestMultiDeque(20, 64, 512);
403 }
404
221 } // namespace 405 } // namespace
222 } // namespace cc 406 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/resource_pool.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698