Index: cc/base/worker_pool_perftest.cc |
diff --git a/cc/base/worker_pool_perftest.cc b/cc/base/worker_pool_perftest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bcbfe09ca8ff184166b65fa811bd3d3c7aa24f04 |
--- /dev/null |
+++ b/cc/base/worker_pool_perftest.cc |
@@ -0,0 +1,111 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "cc/base/worker_pool.h" |
+ |
+#include "base/time.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace cc { |
+ |
+namespace { |
+ |
+static const int kTimeLimitMillis = 1000; |
+static const int kWarmupRuns = 5; |
+static const int kTimeCheckInterval = 1000; |
+ |
+class WorkerPoolPerfTest : public testing::Test { |
+ public: |
+ WorkerPoolPerfTest() : num_runs_(0) {} |
+ |
+ // Overridden from testing::Test: |
+ virtual void SetUp() OVERRIDE {} |
+ virtual void TearDown() OVERRIDE {} |
+ |
+ void EndTest() { |
+ elapsed_ = base::TimeTicks::HighResNow() - start_time_; |
+ } |
+ |
+ void AfterTest(const std::string test_name) { |
+ // Format matches chrome/test/perf/perf_test.h:PrintResult |
+ printf("*RESULT %s: %.2f runs/s\n", |
+ test_name.c_str(), |
+ num_runs_ / elapsed_.InSecondsF()); |
+ } |
+ |
+ void BuildGraph(internal::WorkerPoolTaskDependency* graph, |
+ unsigned current_depth, |
+ unsigned max_depth, |
+ unsigned num_children_per_node) { |
+ for (unsigned i = 0; i < num_children_per_node; ++i) { |
+ internal::WorkerPoolTaskDependency sub_graph; |
+ if (current_depth < max_depth) { |
+ BuildGraph(&sub_graph, |
+ current_depth + 1, |
+ max_depth, |
+ num_children_per_node); |
+ } |
+ internal::WorkerPoolTaskDependency::Create(NULL, graph, &sub_graph); |
+ } |
+ } |
+ |
+ void BuildGraph(unsigned max_depth, unsigned num_children_per_node) { |
+ internal::WorkerPoolTaskDependency graph; |
+ DCHECK(max_depth); |
+ BuildGraph(&graph, 1, max_depth, num_children_per_node); |
+ graph_.Swap(&graph); |
+ } |
+ |
+ bool DidRun() { |
+ ++num_runs_; |
+ if (num_runs_ == kWarmupRuns) |
+ start_time_ = base::TimeTicks::HighResNow(); |
+ |
+ if (!start_time_.is_null() && (num_runs_ % kTimeCheckInterval) == 0) { |
+ base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_; |
+ if (elapsed >= base::TimeDelta::FromMilliseconds(kTimeLimitMillis)) { |
+ elapsed_ = elapsed; |
+ return false; |
+ } |
+ } |
+ |
+ return true; |
+ } |
+ |
+ void RunGraphTraversalTest(const std::string test_name) { |
+ num_runs_ = 0; |
+ do { |
+ for (internal::WorkerPoolTaskGraph::Iterator it(&graph_); it; ++it); |
+ } while (DidRun()); |
+ |
+ AfterTest(test_name); |
+ } |
+ |
+ protected: |
+ internal::WorkerPoolTaskGraph graph_; |
+ base::TimeTicks start_time_; |
+ base::TimeDelta elapsed_; |
+ int num_runs_; |
+}; |
+ |
+TEST_F(WorkerPoolPerfTest, GraphTraversal) { |
+ BuildGraph(1, 10); |
+ RunGraphTraversalTest("graph_traversal_1_10"); |
+ BuildGraph(1, 1000); |
+ RunGraphTraversalTest("graph_traversal_1_1000"); |
+ BuildGraph(2, 10); |
+ RunGraphTraversalTest("graph_traversal_2_10"); |
+ BuildGraph(5, 5); |
+ RunGraphTraversalTest("graph_traversal_5_5"); |
+ BuildGraph(10, 2); |
+ RunGraphTraversalTest("graph_traversal_10_2"); |
+ BuildGraph(10, 1); |
+ RunGraphTraversalTest("graph_traversal_10_1"); |
+ BuildGraph(1000, 1); |
+ RunGraphTraversalTest("graph_traversal_1000_1"); |
+} |
+ |
+} // namespace |
+ |
+} // namespace cc |