summaryrefslogtreecommitdiffstats
path: root/base/test
diff options
context:
space:
mode:
authorjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-09 20:43:12 +0000
committerjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-09 20:43:12 +0000
commit35eff4fd909aa332e1173504cc9a662625c082ff (patch)
treecbad56da6e31cda923230ff8149b5f9351436ada /base/test
parent3720497f3bcb2b36298bbf1a1beed9d5d956a5fb (diff)
downloadchromium_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.cc25
-rw-r--r--base/test/trace_event_analyzer.h14
-rw-r--r--base/test/trace_event_analyzer_unittest.cc41
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.