| Index: cc/resources/task_graph_runner_perftest.cc
|
| diff --git a/cc/resources/task_graph_runner_perftest.cc b/cc/resources/task_graph_runner_perftest.cc
|
| index 80c7fdcb57e57662f7140d8b7ffb89f7a9e35e20..759045091e6b99030cfdbe21a4a716ba984a1cd4 100644
|
| --- a/cc/resources/task_graph_runner_perftest.cc
|
| +++ b/cc/resources/task_graph_runner_perftest.cc
|
| @@ -69,9 +69,12 @@ class TaskGraphRunnerPerfTest : public testing::Test {
|
| CreateTasks(num_tasks, &tasks);
|
| CreateTasks(num_leaf_tasks, &leaf_tasks);
|
|
|
| + // Avoid unnecessary heap allocations by reusing the same graph.
|
| + internal::TaskGraph graph;
|
| +
|
| timer_.Reset();
|
| do {
|
| - internal::GraphNode::Map graph;
|
| + graph.Reset();
|
| BuildTaskGraph(top_level_tasks, tasks, leaf_tasks, &graph);
|
| timer_.NextLap();
|
| } while (!timer_.HasTimeLimitExpired());
|
| @@ -95,20 +98,25 @@ class TaskGraphRunnerPerfTest : public testing::Test {
|
| CreateTasks(num_tasks, &tasks);
|
| CreateTasks(num_leaf_tasks, &leaf_tasks);
|
|
|
| + // Avoid unnecessary heap allocations by reusing the same graph and
|
| + // completed tasks vector.
|
| + internal::TaskGraph graph;
|
| + internal::Task::Vector completed_tasks;
|
| +
|
| timer_.Reset();
|
| do {
|
| - internal::GraphNode::Map graph;
|
| + graph.Reset();
|
| BuildTaskGraph(top_level_tasks, tasks, leaf_tasks, &graph);
|
| task_graph_runner_->SetTaskGraph(namespace_token_, &graph);
|
| // Shouldn't be any tasks to collect as we reschedule the same set
|
| // of tasks.
|
| - DCHECK_EQ(0u, CollectCompletedTasks());
|
| + DCHECK_EQ(0u, CollectCompletedTasks(&completed_tasks));
|
| timer_.NextLap();
|
| } while (!timer_.HasTimeLimitExpired());
|
|
|
| - internal::GraphNode::Map empty;
|
| + internal::TaskGraph empty;
|
| task_graph_runner_->SetTaskGraph(namespace_token_, &empty);
|
| - CollectCompletedTasks();
|
| + CollectCompletedTasks(&completed_tasks);
|
|
|
| perf_test::PrintResult("schedule_tasks",
|
| "",
|
| @@ -132,23 +140,29 @@ class TaskGraphRunnerPerfTest : public testing::Test {
|
| CreateTasks(num_leaf_tasks, &leaf_tasks[i]);
|
| }
|
|
|
| + // Avoid unnecessary heap allocations by reusing the same graph and
|
| + // completed tasks vector.
|
| + internal::TaskGraph graph;
|
| + internal::Task::Vector completed_tasks;
|
| +
|
| int count = 0;
|
| timer_.Reset();
|
| do {
|
| - internal::GraphNode::Map graph;
|
| + graph.Reset();
|
| BuildTaskGraph(top_level_tasks[count % kNumVersions],
|
| tasks[count % kNumVersions],
|
| leaf_tasks[count % kNumVersions],
|
| &graph);
|
| task_graph_runner_->SetTaskGraph(namespace_token_, &graph);
|
| - CollectCompletedTasks();
|
| + CollectCompletedTasks(&completed_tasks);
|
| + completed_tasks.clear();
|
| ++count;
|
| timer_.NextLap();
|
| } while (!timer_.HasTimeLimitExpired());
|
|
|
| - internal::GraphNode::Map empty;
|
| + internal::TaskGraph empty;
|
| task_graph_runner_->SetTaskGraph(namespace_token_, &empty);
|
| - CollectCompletedTasks();
|
| + CollectCompletedTasks(&completed_tasks);
|
|
|
| perf_test::PrintResult("schedule_alternate_tasks",
|
| "",
|
| @@ -169,14 +183,20 @@ class TaskGraphRunnerPerfTest : public testing::Test {
|
| CreateTasks(num_tasks, &tasks);
|
| CreateTasks(num_leaf_tasks, &leaf_tasks);
|
|
|
| + // Avoid unnecessary heap allocations by reusing the same graph and
|
| + // completed tasks vector.
|
| + internal::TaskGraph graph;
|
| + internal::Task::Vector completed_tasks;
|
| +
|
| timer_.Reset();
|
| do {
|
| - internal::GraphNode::Map graph;
|
| + graph.Reset();
|
| BuildTaskGraph(top_level_tasks, tasks, leaf_tasks, &graph);
|
| task_graph_runner_->SetTaskGraph(namespace_token_, &graph);
|
| while (task_graph_runner_->RunTaskForTesting())
|
| continue;
|
| - CollectCompletedTasks();
|
| + CollectCompletedTasks(&completed_tasks);
|
| + completed_tasks.clear();
|
| ResetTasks(&top_level_tasks);
|
| ResetTasks(&tasks);
|
| ResetTasks(&leaf_tasks);
|
| @@ -204,66 +224,51 @@ class TaskGraphRunnerPerfTest : public testing::Test {
|
| void BuildTaskGraph(const PerfTaskImpl::Vector& top_level_tasks,
|
| const PerfTaskImpl::Vector& tasks,
|
| const PerfTaskImpl::Vector& leaf_tasks,
|
| - internal::GraphNode::Map* graph) {
|
| - typedef std::vector<internal::GraphNode*> NodeVector;
|
| + internal::TaskGraph* graph) {
|
| + DCHECK(graph->nodes.empty());
|
| + DCHECK(graph->edges.empty());
|
|
|
| - NodeVector top_level_nodes;
|
| - top_level_nodes.reserve(top_level_tasks.size());
|
| - for (PerfTaskImpl::Vector::const_iterator it = top_level_tasks.begin();
|
| - it != top_level_tasks.end();
|
| - ++it) {
|
| - internal::Task* top_level_task = it->get();
|
| - scoped_ptr<internal::GraphNode> top_level_node(
|
| - new internal::GraphNode(top_level_task, 0u));
|
| -
|
| - top_level_nodes.push_back(top_level_node.get());
|
| - graph->set(top_level_task, top_level_node.Pass());
|
| - }
|
| -
|
| - NodeVector leaf_nodes;
|
| - leaf_nodes.reserve(leaf_tasks.size());
|
| for (PerfTaskImpl::Vector::const_iterator it = leaf_tasks.begin();
|
| it != leaf_tasks.end();
|
| ++it) {
|
| - internal::Task* leaf_task = it->get();
|
| - scoped_ptr<internal::GraphNode> leaf_node(
|
| - new internal::GraphNode(leaf_task, 0u));
|
| -
|
| - leaf_nodes.push_back(leaf_node.get());
|
| - graph->set(leaf_task, leaf_node.Pass());
|
| + graph->nodes.push_back(internal::TaskGraph::Node(it->get(), 0u, 0u));
|
| }
|
|
|
| for (PerfTaskImpl::Vector::const_iterator it = tasks.begin();
|
| it != tasks.end();
|
| ++it) {
|
| - internal::Task* task = it->get();
|
| - scoped_ptr<internal::GraphNode> node(new internal::GraphNode(task, 0u));
|
| -
|
| - for (NodeVector::iterator node_it = top_level_nodes.begin();
|
| - node_it != top_level_nodes.end();
|
| - ++node_it) {
|
| - internal::GraphNode* top_level_node = *node_it;
|
| - node->add_dependent(top_level_node);
|
| - top_level_node->add_dependency();
|
| + graph->nodes.push_back(
|
| + internal::TaskGraph::Node(it->get(), 0u, leaf_tasks.size()));
|
| +
|
| + for (PerfTaskImpl::Vector::const_iterator leaf_it = leaf_tasks.begin();
|
| + leaf_it != leaf_tasks.end();
|
| + ++leaf_it) {
|
| + graph->edges.push_back(
|
| + internal::TaskGraph::Edge(leaf_it->get(), it->get()));
|
| }
|
|
|
| - for (NodeVector::iterator node_it = leaf_nodes.begin();
|
| - node_it != leaf_nodes.end();
|
| - ++node_it) {
|
| - internal::GraphNode* leaf_node = *node_it;
|
| - leaf_node->add_dependent(node.get());
|
| - node->add_dependency();
|
| + for (PerfTaskImpl::Vector::const_iterator top_level_it =
|
| + top_level_tasks.begin();
|
| + top_level_it != top_level_tasks.end();
|
| + ++top_level_it) {
|
| + graph->edges.push_back(
|
| + internal::TaskGraph::Edge(it->get(), top_level_it->get()));
|
| }
|
| + }
|
|
|
| - graph->set(task, node.Pass());
|
| + for (PerfTaskImpl::Vector::const_iterator it = top_level_tasks.begin();
|
| + it != top_level_tasks.end();
|
| + ++it) {
|
| + graph->nodes.push_back(
|
| + internal::TaskGraph::Node(it->get(), 0u, tasks.size()));
|
| }
|
| }
|
|
|
| - size_t CollectCompletedTasks() {
|
| - internal::Task::Vector completed_tasks;
|
| + size_t CollectCompletedTasks(internal::Task::Vector* completed_tasks) {
|
| + DCHECK(completed_tasks->empty());
|
| task_graph_runner_->CollectCompletedTasks(namespace_token_,
|
| - &completed_tasks);
|
| - return completed_tasks.size();
|
| + completed_tasks);
|
| + return completed_tasks->size();
|
| }
|
|
|
| scoped_ptr<internal::TaskGraphRunner> task_graph_runner_;
|
|
|