OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "cc/resources/raster_worker_pool.h" |
| 6 |
| 7 #include "base/time.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 |
| 10 namespace cc { |
| 11 |
| 12 namespace { |
| 13 |
| 14 static const int kTimeLimitMillis = 2000; |
| 15 static const int kWarmupRuns = 5; |
| 16 static const int kTimeCheckInterval = 10; |
| 17 |
| 18 class PerfWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 19 public: |
| 20 // Overridden from internal::WorkerPoolTask: |
| 21 virtual void RunOnThread(unsigned thread_index) OVERRIDE {} |
| 22 virtual void DispatchCompletionCallback() OVERRIDE {} |
| 23 |
| 24 private: |
| 25 virtual ~PerfWorkerPoolTaskImpl() {} |
| 26 }; |
| 27 |
| 28 class PerfRasterWorkerPool : public RasterWorkerPool { |
| 29 public: |
| 30 PerfRasterWorkerPool() : RasterWorkerPool(NULL, 1) {} |
| 31 virtual ~PerfRasterWorkerPool() {} |
| 32 |
| 33 static scoped_ptr<PerfRasterWorkerPool> Create() { |
| 34 return make_scoped_ptr(new PerfRasterWorkerPool); |
| 35 } |
| 36 |
| 37 // Overridden from RasterWorkerPool: |
| 38 virtual void ScheduleTasks(RasterTask::Queue* queue) OVERRIDE { |
| 39 NOTREACHED(); |
| 40 } |
| 41 |
| 42 void SetRasterTasks(RasterTask::Queue* queue) { |
| 43 RasterWorkerPool::SetRasterTasks(queue); |
| 44 |
| 45 TaskMap perf_tasks; |
| 46 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
| 47 it != raster_tasks().end(); ++it) { |
| 48 internal::RasterWorkerPoolTask* task = it->get(); |
| 49 |
| 50 scoped_refptr<internal::WorkerPoolTask> new_perf_task( |
| 51 new PerfWorkerPoolTaskImpl); |
| 52 perf_tasks[task] = new_perf_task; |
| 53 } |
| 54 |
| 55 perf_tasks_.swap(perf_tasks); |
| 56 } |
| 57 |
| 58 void BuildTaskGraph() { |
| 59 RasterTaskGraph graph; |
| 60 |
| 61 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
| 62 it != raster_tasks().end(); ++it) { |
| 63 internal::RasterWorkerPoolTask* task = it->get(); |
| 64 |
| 65 TaskMap::iterator perf_it = perf_tasks_.find(task); |
| 66 DCHECK(perf_it != perf_tasks_.end()); |
| 67 if (perf_it != perf_tasks_.end()) { |
| 68 internal::WorkerPoolTask* perf_task = perf_it->second.get(); |
| 69 graph.InsertRasterTask(perf_task, task->dependencies()); |
| 70 } |
| 71 } |
| 72 } |
| 73 |
| 74 private: |
| 75 TaskMap perf_tasks_; |
| 76 |
| 77 DISALLOW_COPY_AND_ASSIGN(PerfRasterWorkerPool); |
| 78 }; |
| 79 |
| 80 class RasterWorkerPoolPerfTest : public testing::Test { |
| 81 public: |
| 82 RasterWorkerPoolPerfTest() : num_runs_(0) {} |
| 83 |
| 84 // Overridden from testing::Test: |
| 85 virtual void SetUp() OVERRIDE { |
| 86 raster_worker_pool_ = PerfRasterWorkerPool::Create(); |
| 87 } |
| 88 virtual void TearDown() OVERRIDE { |
| 89 raster_worker_pool_->Shutdown(); |
| 90 } |
| 91 |
| 92 void EndTest() { |
| 93 elapsed_ = base::TimeTicks::HighResNow() - start_time_; |
| 94 } |
| 95 |
| 96 void AfterTest(const std::string test_name) { |
| 97 // Format matches chrome/test/perf/perf_test.h:PrintResult |
| 98 printf("*RESULT %s: %.2f runs/s\n", |
| 99 test_name.c_str(), |
| 100 num_runs_ / elapsed_.InSecondsF()); |
| 101 } |
| 102 |
| 103 bool DidRun() { |
| 104 ++num_runs_; |
| 105 if (num_runs_ == kWarmupRuns) |
| 106 start_time_ = base::TimeTicks::HighResNow(); |
| 107 |
| 108 if (!start_time_.is_null() && (num_runs_ % kTimeCheckInterval) == 0) { |
| 109 base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_; |
| 110 if (elapsed >= base::TimeDelta::FromMilliseconds(kTimeLimitMillis)) { |
| 111 elapsed_ = elapsed; |
| 112 return false; |
| 113 } |
| 114 } |
| 115 |
| 116 return true; |
| 117 } |
| 118 |
| 119 void CreateTasks(RasterWorkerPool::RasterTask::Queue* tasks, |
| 120 unsigned num_raster_tasks, |
| 121 unsigned num_image_decode_tasks) { |
| 122 typedef std::vector<RasterWorkerPool::Task> TaskVector; |
| 123 TaskVector image_decode_tasks; |
| 124 |
| 125 for (unsigned i = 0; i < num_image_decode_tasks; ++i) { |
| 126 image_decode_tasks.push_back( |
| 127 RasterWorkerPool::CreateImageDecodeTask( |
| 128 NULL, |
| 129 0, |
| 130 NULL, |
| 131 base::Bind( |
| 132 &RasterWorkerPoolPerfTest::OnImageDecodeTaskCompleted))); |
| 133 } |
| 134 |
| 135 for (unsigned i = 0; i < num_raster_tasks; ++i) { |
| 136 RasterWorkerPool::Task::Set decode_tasks; |
| 137 for (TaskVector::iterator it = image_decode_tasks.begin(); |
| 138 it != image_decode_tasks.end(); ++it) |
| 139 decode_tasks.Insert(*it); |
| 140 |
| 141 tasks->Append( |
| 142 RasterWorkerPool::CreateRasterTask( |
| 143 NULL, |
| 144 NULL, |
| 145 gfx::Rect(), |
| 146 1.0, |
| 147 HIGH_QUALITY_RASTER_MODE, |
| 148 false, |
| 149 RasterTaskMetadata(), |
| 150 NULL, |
| 151 base::Bind(&RasterWorkerPoolPerfTest::OnRasterTaskCompleted), |
| 152 &decode_tasks), |
| 153 false); |
| 154 } |
| 155 } |
| 156 |
| 157 void RunBuildTaskGraphTest(const std::string test_name, |
| 158 unsigned num_raster_tasks, |
| 159 unsigned num_image_decode_tasks) { |
| 160 start_time_ = base::TimeTicks(); |
| 161 num_runs_ = 0; |
| 162 RasterWorkerPool::RasterTask::Queue tasks; |
| 163 CreateTasks(&tasks, num_raster_tasks, num_image_decode_tasks); |
| 164 raster_worker_pool_->SetRasterTasks(&tasks); |
| 165 do { |
| 166 raster_worker_pool_->BuildTaskGraph(); |
| 167 } while (DidRun()); |
| 168 |
| 169 AfterTest(test_name); |
| 170 } |
| 171 |
| 172 protected: |
| 173 static void OnRasterTaskCompleted(const PicturePileImpl::Analysis& analysis, |
| 174 bool was_canceled) {} |
| 175 static void OnImageDecodeTaskCompleted(bool was_canceled) {} |
| 176 |
| 177 scoped_ptr<PerfRasterWorkerPool> raster_worker_pool_; |
| 178 base::TimeTicks start_time_; |
| 179 base::TimeDelta elapsed_; |
| 180 int num_runs_; |
| 181 }; |
| 182 |
| 183 TEST_F(RasterWorkerPoolPerfTest, BuildTaskGraph) { |
| 184 RunBuildTaskGraphTest("build_task_graph_10_0", 10, 0); |
| 185 RunBuildTaskGraphTest("build_task_graph_100_0", 100, 0); |
| 186 RunBuildTaskGraphTest("build_task_graph_1000_0", 1000, 0); |
| 187 RunBuildTaskGraphTest("build_task_graph_10_1", 10, 1); |
| 188 RunBuildTaskGraphTest("build_task_graph_100_1", 100, 1); |
| 189 RunBuildTaskGraphTest("build_task_graph_1000_1", 1000, 1); |
| 190 RunBuildTaskGraphTest("build_task_graph_10_4", 10, 4); |
| 191 RunBuildTaskGraphTest("build_task_graph_100_4", 100, 4); |
| 192 RunBuildTaskGraphTest("build_task_graph_1000_4", 1000, 4); |
| 193 RunBuildTaskGraphTest("build_task_graph_10_16", 10, 16); |
| 194 RunBuildTaskGraphTest("build_task_graph_100_16", 100, 16); |
| 195 RunBuildTaskGraphTest("build_task_graph_1000_16", 1000, 16); |
| 196 } |
| 197 |
| 198 } // namespace |
| 199 |
| 200 } // namespace cc |
OLD | NEW |