| Index: base/test/trace_event_analyzer.cc
|
| diff --git a/base/test/trace_event_analyzer.cc b/base/test/trace_event_analyzer.cc
|
| index cead424b10fd25284721c2977c9f30652904211c..a3e2705dd6f3009d111d5eaad47b8e163581edad 100644
|
| --- a/base/test/trace_event_analyzer.cc
|
| +++ b/base/test/trace_event_analyzer.cc
|
| @@ -713,6 +713,41 @@ const std::string& TraceAnalyzer::GetThreadName(
|
| return thread_names_[thread];
|
| }
|
|
|
| +bool TraceAnalyzer::GetRateStats(const TraceEventVector& events, Stats* stats) {
|
| + // Need at least 3 events to calculate rate stats.
|
| + if (events.size() < 3) {
|
| + 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[i + 1]->timestamp - events[i]->timestamp;
|
| + if (delta < 0.0) {
|
| + LOG(ERROR) << "Events are out of order";
|
| + return false;
|
| + }
|
| + deltas.push_back(delta);
|
| + delta_sum += delta;
|
| + }
|
| +
|
| + 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);
|
| +
|
| + double sum_mean_offsets_squared = 0.0;
|
| + for (size_t i = 0; i < num_deltas; ++i) {
|
| + double offset = fabs(deltas[i] - stats->mean_us);
|
| + sum_mean_offsets_squared += offset * offset;
|
| + }
|
| + stats->standard_deviation_us =
|
| + sum_mean_offsets_squared / static_cast<double>(num_deltas - 1);
|
| +
|
| + return true;
|
| +}
|
| +
|
| void TraceAnalyzer::ParseMetadata() {
|
| for (size_t i = 0; i < raw_events_.size(); ++i) {
|
| TraceEvent& this_event = raw_events_[i];
|
|
|