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_; |