| Index: cc/resources/worker_pool_perftest.cc
|
| diff --git a/cc/resources/worker_pool_perftest.cc b/cc/resources/worker_pool_perftest.cc
|
| index 9b52ae4678253dc86e079eb417784799c9b0485f..b7a1c4cb1bbbb12d1b8d4ef08f37cefc7dd15ad8 100644
|
| --- a/cc/resources/worker_pool_perftest.cc
|
| +++ b/cc/resources/worker_pool_perftest.cc
|
| @@ -16,26 +16,20 @@ static const int kTimeLimitMillis = 2000;
|
| static const int kWarmupRuns = 5;
|
| static const int kTimeCheckInterval = 10;
|
|
|
| -class PerfTaskImpl : public internal::WorkerPoolTask {
|
| +class PerfWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
| public:
|
| - explicit PerfTaskImpl(internal::WorkerPoolTask::TaskVector* dependencies)
|
| - : internal::WorkerPoolTask(dependencies) {}
|
| -
|
| // Overridden from internal::WorkerPoolTask:
|
| virtual void RunOnThread(unsigned thread_index) OVERRIDE {}
|
| virtual void DispatchCompletionCallback() OVERRIDE {}
|
|
|
| private:
|
| - virtual ~PerfTaskImpl() {}
|
| + virtual ~PerfWorkerPoolTaskImpl() {}
|
| };
|
|
|
| -class PerfControlTaskImpl : public internal::WorkerPoolTask {
|
| +class PerfControlWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
| public:
|
| - explicit PerfControlTaskImpl(
|
| - internal::WorkerPoolTask::TaskVector* dependencies)
|
| - : internal::WorkerPoolTask(dependencies),
|
| - did_start_(new CompletionEvent),
|
| - can_finish_(new CompletionEvent) {}
|
| + PerfControlWorkerPoolTaskImpl() : did_start_(new CompletionEvent),
|
| + can_finish_(new CompletionEvent) {}
|
|
|
| // Overridden from internal::WorkerPoolTask:
|
| virtual void RunOnThread(unsigned thread_index) OVERRIDE {
|
| @@ -53,10 +47,12 @@ class PerfControlTaskImpl : public internal::WorkerPoolTask {
|
| }
|
|
|
| private:
|
| - virtual ~PerfControlTaskImpl() {}
|
| + virtual ~PerfControlWorkerPoolTaskImpl() {}
|
|
|
| scoped_ptr<CompletionEvent> did_start_;
|
| scoped_ptr<CompletionEvent> can_finish_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PerfControlWorkerPoolTaskImpl);
|
| };
|
|
|
| class PerfWorkerPool : public WorkerPool {
|
| @@ -68,17 +64,97 @@ class PerfWorkerPool : public WorkerPool {
|
| return make_scoped_ptr(new PerfWorkerPool);
|
| }
|
|
|
| - void BuildTaskGraph(internal::WorkerPoolTask* root) {
|
| - graph_.clear();
|
| - WorkerPool::BuildTaskGraph(root, &graph_);
|
| - }
|
| + void ScheduleTasks(internal::WorkerPoolTask* root_task,
|
| + internal::WorkerPoolTask* leaf_task,
|
| + unsigned max_depth,
|
| + unsigned num_children_per_node) {
|
| + TaskVector tasks;
|
| + unsigned priority = 0u;
|
| + TaskGraph graph;
|
| +
|
| + scoped_ptr<GraphNode> root_node;
|
| + if (root_task) {
|
| + root_node = make_scoped_ptr(new GraphNode);
|
| + root_node->set_task(root_task);
|
| + }
|
| +
|
| + scoped_ptr<GraphNode> leaf_node;
|
| + if (leaf_task) {
|
| + leaf_node = make_scoped_ptr(new GraphNode);
|
| + leaf_node->set_task(leaf_task);
|
| + }
|
|
|
| - void ScheduleTasks() {
|
| - SetTaskGraph(&graph_);
|
| + if (max_depth) {
|
| + priority = BuildTaskGraph(&tasks,
|
| + &graph,
|
| + root_node.get(),
|
| + leaf_node.get(),
|
| + priority,
|
| + 0,
|
| + max_depth,
|
| + num_children_per_node);
|
| + }
|
| +
|
| + if (leaf_node) {
|
| + leaf_node->set_priority(priority++);
|
| + graph.set(leaf_task, leaf_node.Pass());
|
| + }
|
| +
|
| + if (root_node) {
|
| + root_node->set_priority(priority++);
|
| + graph.set(root_task, root_node.Pass());
|
| + }
|
| +
|
| + SetTaskGraph(&graph);
|
| +
|
| + tasks_.swap(tasks);
|
| }
|
|
|
| private:
|
| - TaskGraph graph_;
|
| + typedef std::vector<scoped_refptr<internal::WorkerPoolTask> > TaskVector;
|
| +
|
| + unsigned BuildTaskGraph(TaskVector* tasks,
|
| + TaskGraph* graph,
|
| + GraphNode* dependent_node,
|
| + GraphNode* leaf_node,
|
| + unsigned priority,
|
| + unsigned current_depth,
|
| + unsigned max_depth,
|
| + unsigned num_children_per_node) {
|
| + scoped_refptr<PerfWorkerPoolTaskImpl> task(new PerfWorkerPoolTaskImpl);
|
| + scoped_ptr<GraphNode> node(new GraphNode);
|
| + node->set_task(task.get());
|
| +
|
| + if (current_depth < max_depth) {
|
| + for (unsigned i = 0; i < num_children_per_node; ++i) {
|
| + priority = BuildTaskGraph(tasks,
|
| + graph,
|
| + node.get(),
|
| + leaf_node,
|
| + priority,
|
| + current_depth + 1,
|
| + max_depth,
|
| + num_children_per_node);
|
| + }
|
| + } else if (leaf_node) {
|
| + leaf_node->add_dependent(node.get());
|
| + node->add_dependency();
|
| + }
|
| +
|
| + if (dependent_node) {
|
| + node->add_dependent(dependent_node);
|
| + dependent_node->add_dependency();
|
| + }
|
| + node->set_priority(priority);
|
| + graph->set(task.get(), node.Pass());
|
| + tasks->push_back(task.get());
|
| +
|
| + return priority + 1;
|
| + }
|
| +
|
| + TaskVector tasks_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PerfWorkerPool);
|
| };
|
|
|
| class WorkerPoolPerfTest : public testing::Test {
|
| @@ -105,24 +181,6 @@ class WorkerPoolPerfTest : public testing::Test {
|
| num_runs_ / elapsed_.InSecondsF());
|
| }
|
|
|
| - void CreateTasks(internal::WorkerPoolTask::TaskVector* dependencies,
|
| - unsigned current_depth,
|
| - unsigned max_depth,
|
| - unsigned num_children_per_node) {
|
| - internal::WorkerPoolTask::TaskVector children;
|
| - if (current_depth < max_depth) {
|
| - for (unsigned i = 0; i < num_children_per_node; ++i) {
|
| - CreateTasks(&children,
|
| - current_depth + 1,
|
| - max_depth,
|
| - num_children_per_node);
|
| - }
|
| - } else if (leaf_task_.get()) {
|
| - children.push_back(leaf_task_);
|
| - }
|
| - dependencies->push_back(make_scoped_refptr(new PerfTaskImpl(&children)));
|
| - }
|
| -
|
| bool DidRun() {
|
| ++num_runs_;
|
| if (num_runs_ == kWarmupRuns)
|
| @@ -139,42 +197,20 @@ class WorkerPoolPerfTest : public testing::Test {
|
| return true;
|
| }
|
|
|
| - void RunBuildTaskGraphTest(const std::string test_name,
|
| - unsigned max_depth,
|
| - unsigned num_children_per_node) {
|
| - start_time_ = base::TimeTicks();
|
| - num_runs_ = 0;
|
| - internal::WorkerPoolTask::TaskVector children;
|
| - CreateTasks(&children, 0, max_depth, num_children_per_node);
|
| - scoped_refptr<PerfTaskImpl> root_task(
|
| - make_scoped_refptr(new PerfTaskImpl(&children)));
|
| - do {
|
| - worker_pool_->BuildTaskGraph(root_task.get());
|
| - } while (DidRun());
|
| -
|
| - AfterTest(test_name);
|
| - }
|
| -
|
| void RunScheduleTasksTest(const std::string test_name,
|
| unsigned max_depth,
|
| unsigned num_children_per_node) {
|
| start_time_ = base::TimeTicks();
|
| num_runs_ = 0;
|
| do {
|
| - internal::WorkerPoolTask::TaskVector empty;
|
| - leaf_task_ = make_scoped_refptr(new PerfControlTaskImpl(&empty));
|
| - internal::WorkerPoolTask::TaskVector children;
|
| - CreateTasks(&children, 0, max_depth, num_children_per_node);
|
| - scoped_refptr<PerfTaskImpl> root_task(
|
| - make_scoped_refptr(new PerfTaskImpl(&children)));
|
| -
|
| - worker_pool_->BuildTaskGraph(root_task.get());
|
| - worker_pool_->ScheduleTasks();
|
| - leaf_task_->WaitForTaskToStartRunning();
|
| - worker_pool_->BuildTaskGraph(NULL);
|
| - worker_pool_->ScheduleTasks();
|
| + scoped_refptr<PerfControlWorkerPoolTaskImpl> leaf_task(
|
| + new PerfControlWorkerPoolTaskImpl);
|
| + worker_pool_->ScheduleTasks(
|
| + NULL, leaf_task.get(), max_depth, num_children_per_node);
|
| + leaf_task->WaitForTaskToStartRunning();
|
| + worker_pool_->ScheduleTasks(NULL, NULL, 0, 0);
|
| worker_pool_->CheckForCompletedTasks();
|
| - leaf_task_->AllowTaskToFinish();
|
| + leaf_task->AllowTaskToFinish();
|
| } while (DidRun());
|
|
|
| AfterTest(test_name);
|
| @@ -186,13 +222,10 @@ class WorkerPoolPerfTest : public testing::Test {
|
| start_time_ = base::TimeTicks();
|
| num_runs_ = 0;
|
| do {
|
| - internal::WorkerPoolTask::TaskVector children;
|
| - CreateTasks(&children, 0, max_depth, num_children_per_node);
|
| - scoped_refptr<PerfControlTaskImpl> root_task(
|
| - make_scoped_refptr(new PerfControlTaskImpl(&children)));
|
| -
|
| - worker_pool_->BuildTaskGraph(root_task.get());
|
| - worker_pool_->ScheduleTasks();
|
| + scoped_refptr<PerfControlWorkerPoolTaskImpl> root_task(
|
| + new PerfControlWorkerPoolTaskImpl);
|
| + worker_pool_->ScheduleTasks(
|
| + root_task.get(), NULL, max_depth, num_children_per_node);
|
| root_task->WaitForTaskToStartRunning();
|
| root_task->AllowTaskToFinish();
|
| worker_pool_->CheckForCompletedTasks();
|
| @@ -203,22 +236,11 @@ class WorkerPoolPerfTest : public testing::Test {
|
|
|
| protected:
|
| scoped_ptr<PerfWorkerPool> worker_pool_;
|
| - scoped_refptr<PerfControlTaskImpl> leaf_task_;
|
| base::TimeTicks start_time_;
|
| base::TimeDelta elapsed_;
|
| int num_runs_;
|
| };
|
|
|
| -TEST_F(WorkerPoolPerfTest, BuildTaskGraph) {
|
| - RunBuildTaskGraphTest("build_task_graph_1_10", 1, 10);
|
| - RunBuildTaskGraphTest("build_task_graph_1_1000", 1, 1000);
|
| - RunBuildTaskGraphTest("build_task_graph_2_10", 2, 10);
|
| - RunBuildTaskGraphTest("build_task_graph_5_5", 5, 5);
|
| - RunBuildTaskGraphTest("build_task_graph_10_2", 10, 2);
|
| - RunBuildTaskGraphTest("build_task_graph_1000_1", 1000, 1);
|
| - RunBuildTaskGraphTest("build_task_graph_10_1", 10, 1);
|
| -}
|
| -
|
| TEST_F(WorkerPoolPerfTest, ScheduleTasks) {
|
| RunScheduleTasksTest("schedule_tasks_1_10", 1, 10);
|
| RunScheduleTasksTest("schedule_tasks_1_1000", 1, 1000);
|
|
|