diff options
author | jbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-09 20:43:12 +0000 |
---|---|---|
committer | jbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-09 20:43:12 +0000 |
commit | 35eff4fd909aa332e1173504cc9a662625c082ff (patch) | |
tree | cbad56da6e31cda923230ff8149b5f9351436ada /base/test | |
parent | 3720497f3bcb2b36298bbf1a1beed9d5d956a5fb (diff) | |
download | chromium_src-35eff4fd909aa332e1173504cc9a662625c082ff.zip chromium_src-35eff4fd909aa332e1173504cc9a662625c082ff.tar.gz chromium_src-35eff4fd909aa332e1173504cc9a662625c082ff.tar.bz2 |
Add test to for RAF-spinning in accelerated mode with no damage.
R=jamesr,zmo
BUG=114914
Review URL: http://codereview.chromium.org/9580021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125891 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/test')
-rw-r--r-- | base/test/trace_event_analyzer.cc | 25 | ||||
-rw-r--r-- | base/test/trace_event_analyzer.h | 14 | ||||
-rw-r--r-- | base/test/trace_event_analyzer_unittest.cc | 41 |
3 files changed, 71 insertions, 9 deletions
diff --git a/base/test/trace_event_analyzer.cc b/base/test/trace_event_analyzer.cc index db1de4c..ac4968c9 100644 --- a/base/test/trace_event_analyzer.cc +++ b/base/test/trace_event_analyzer.cc @@ -817,16 +817,18 @@ void TraceAnalyzer::ParseMetadata() { // TraceEventVector utility functions. -bool GetRateStats(const TraceEventVector& events, RateStats* stats) { +bool GetRateStats(const TraceEventVector& events, + RateStats* stats, + const RateStatsOptions* options) { CHECK(stats); // Need at least 3 events to calculate rate stats. - if (events.size() < 3) { + const size_t kMinEvents = 3; + if (events.size() < kMinEvents) { LOG(ERROR) << "Not enough events: " << events.size(); return false; } std::vector<double> deltas; - double delta_sum = 0.0; size_t num_deltas = events.size() - 1; for (size_t i = 0; i < num_deltas; ++i) { double delta = events.at(i + 1)->timestamp - events.at(i)->timestamp; @@ -835,9 +837,24 @@ bool GetRateStats(const TraceEventVector& events, RateStats* stats) { return false; } deltas.push_back(delta); - delta_sum += delta; } + std::sort(deltas.begin(), deltas.end()); + + if (options) { + if (options->trim_min + options->trim_max > events.size() - kMinEvents) { + LOG(ERROR) << "Attempt to trim too many events"; + return false; + } + deltas.erase(deltas.begin(), deltas.begin() + options->trim_min); + deltas.erase(deltas.end() - options->trim_max, deltas.end()); + } + + num_deltas = deltas.size(); + double delta_sum = 0.0; + for (size_t i = 0; i < num_deltas; ++i) + delta_sum += deltas[i]; + stats->min_us = *std::min_element(deltas.begin(), deltas.end()); stats->max_us = *std::max_element(deltas.begin(), deltas.end()); stats->mean_us = delta_sum / static_cast<double>(num_deltas); diff --git a/base/test/trace_event_analyzer.h b/base/test/trace_event_analyzer.h index 05a008e..df46839 100644 --- a/base/test/trace_event_analyzer.h +++ b/base/test/trace_event_analyzer.h @@ -553,9 +553,21 @@ struct RateStats { double standard_deviation_us; }; +struct RateStatsOptions { + RateStatsOptions() : trim_min(0u), trim_max(0u) {} + // After the times between events are sorted, the number of specified elements + // will be trimmed before calculating the RateStats. This is useful in cases + // where extreme outliers are tolerable and should not skew the overall + // average. + size_t trim_min; // Trim this many minimum times. + size_t trim_max; // Trim this many maximum times. +}; + // Calculate min/max/mean and standard deviation from the times between // adjacent events. -bool GetRateStats(const TraceEventVector& events, RateStats* stats); +bool GetRateStats(const TraceEventVector& events, + RateStats* stats, + const RateStatsOptions* options); // Starting from |position|, find the first event that matches |query|. // Returns true if found, false otherwise. diff --git a/base/test/trace_event_analyzer_unittest.cc b/base/test/trace_event_analyzer_unittest.cc index e533c49..55309db 100644 --- a/base/test/trace_event_analyzer_unittest.cc +++ b/base/test/trace_event_analyzer_unittest.cc @@ -644,36 +644,69 @@ TEST_F(TraceEventAnalyzerTest, RateStats) { event.timestamp = 0.0; double little_delta = 1.0; double big_delta = 10.0; + double tiny_delta = 0.1; RateStats stats; + RateStatsOptions options; + // Insert 10 events, each apart by little_delta. for (int i = 0; i < 10; ++i) { event.timestamp += little_delta; events.push_back(event); event_ptrs.push_back(&events.back()); } - ASSERT_TRUE(GetRateStats(event_ptrs, &stats)); + ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL)); EXPECT_EQ(little_delta, stats.mean_us); EXPECT_EQ(little_delta, stats.min_us); EXPECT_EQ(little_delta, stats.max_us); EXPECT_EQ(0.0, stats.standard_deviation_us); + // Add an event apart by big_delta. event.timestamp += big_delta; events.push_back(event); event_ptrs.push_back(&events.back()); - ASSERT_TRUE(GetRateStats(event_ptrs, &stats)); + ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL)); EXPECT_LT(little_delta, stats.mean_us); EXPECT_EQ(little_delta, stats.min_us); EXPECT_EQ(big_delta, stats.max_us); EXPECT_LT(0.0, stats.standard_deviation_us); + // Trim off the biggest delta and verify stats. + options.trim_min = 0; + options.trim_max = 1; + ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options)); + EXPECT_EQ(little_delta, stats.mean_us); + EXPECT_EQ(little_delta, stats.min_us); + EXPECT_EQ(little_delta, stats.max_us); + EXPECT_EQ(0.0, stats.standard_deviation_us); + + // Add an event apart by tiny_delta. + event.timestamp += tiny_delta; + events.push_back(event); + event_ptrs.push_back(&events.back()); + + // Trim off both the biggest and tiniest delta and verify stats. + options.trim_min = 1; + options.trim_max = 1; + ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options)); + EXPECT_EQ(little_delta, stats.mean_us); + EXPECT_EQ(little_delta, stats.min_us); + EXPECT_EQ(little_delta, stats.max_us); + EXPECT_EQ(0.0, stats.standard_deviation_us); + + // Verify smallest allowed number of events. TraceEventVector few_event_ptrs; few_event_ptrs.push_back(&event); few_event_ptrs.push_back(&event); - ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats)); + ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, NULL)); few_event_ptrs.push_back(&event); - ASSERT_TRUE(GetRateStats(few_event_ptrs, &stats)); + ASSERT_TRUE(GetRateStats(few_event_ptrs, &stats, NULL)); + + // Trim off more than allowed and verify failure. + options.trim_min = 0; + options.trim_max = 1; + ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, &options)); } // Test FindFirstOf and FindLastOf. |