Index: base/test/trace_event_analyzer.cc |
diff --git a/base/test/trace_event_analyzer.cc b/base/test/trace_event_analyzer.cc |
index 183f29a93af04fdc4e2e05a224f598596352ba2c..26e397f423e48c1600793af42b4613d8df55554a 100644 |
--- a/base/test/trace_event_analyzer.cc |
+++ b/base/test/trace_event_analyzer.cc |
@@ -615,7 +615,7 @@ namespace { |
// Search |events| for |query| and add matches to |output|. |
size_t FindMatchingEvents(const std::vector<TraceEvent>& events, |
const Query& query, |
- TraceAnalyzer::TraceEventVector* output) { |
+ TraceEventVector* output) { |
for (size_t i = 0; i < events.size(); ++i) { |
if (query.Evaluate(events[i])) |
output->push_back(&events[i]); |
@@ -648,6 +648,122 @@ bool ParseEventsFromJson(const std::string& json, |
} // namespace |
+// TraceEventVector |
+ |
+bool TraceEventVector::GetRateStats(RateStats* stats) { |
+ // Need at least 3 events to calculate rate stats. |
+ if (size() < 3) { |
+ LOG(ERROR) << "Not enough events: " << size(); |
+ return false; |
+ } |
+ |
+ std::vector<double> deltas; |
+ double delta_sum = 0.0; |
+ size_t num_deltas = size() - 1; |
+ for (size_t i = 0; i < num_deltas; ++i) { |
+ double delta = at(i + 1)->timestamp - at(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 = |
Paweł Hajdan Jr.
2011/12/12 17:21:51
Isn't this standard deviation code being duplicate
jbates
2011/12/12 22:00:32
This is just a code move, so no duplication.
|
+ sum_mean_offsets_squared / static_cast<double>(num_deltas - 1); |
+ |
+ return true; |
+} |
+ |
+bool TraceEventVector::FindFirstOf(Query query, |
+ size_t position, |
+ size_t* return_index) const { |
+ for (size_t i = position; i < size(); ++i) { |
+ if (query.Evaluate(*at(i))) { |
+ *return_index = i; |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+bool TraceEventVector::FindLastOf(Query query, |
+ size_t position, |
+ size_t* return_index) const { |
+ if (empty()) |
+ return false; |
+ position = (position < size()) ? position : size() - 1; |
+ for (;;) { |
Paweł Hajdan Jr.
2011/12/12 17:21:51
nit: Why not "while (true)"? It's generally more d
jbates
2011/12/12 22:00:32
Grepping base/ for 'for (;;)' turns up slightly mo
|
+ if (query.Evaluate(*at(position))) { |
+ *return_index = position; |
+ return true; |
+ } |
+ if (position == 0) |
+ return false; |
+ --position; |
+ } |
+ return false; |
+} |
+ |
+bool TraceEventVector::FindClosest(Query query, |
+ size_t position, |
+ size_t* return_closest, |
+ size_t* return_second_closest) const { |
+ if (empty() || position >= size()) |
+ return false; |
+ size_t closest = size(); |
+ size_t second_closest = size(); |
+ for (size_t i = 0; i < size(); ++i) { |
+ if (!query.Evaluate(*at(i))) |
+ continue; |
+ if (closest == size()) { |
+ closest = i; |
+ continue; |
+ } |
+ if (fabs(at(i)->timestamp - at(position)->timestamp) < |
+ fabs(at(closest)->timestamp - at(position)->timestamp)) { |
+ second_closest = closest; |
+ closest = i; |
+ } else if (second_closest == size()) { |
+ second_closest = i; |
+ } |
+ } |
+ |
+ if (closest < size() && |
+ (!return_second_closest || second_closest < size())) { |
+ *return_closest = closest; |
+ if (return_second_closest) |
+ *return_second_closest = second_closest; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+int TraceEventVector::CountMatches(Query query, |
+ size_t begin_position, |
+ size_t end_position) const { |
+ if (begin_position >= size()) |
+ return 0; |
+ end_position = (end_position < size()) ? end_position : size(); |
+ int count = 0; |
+ for (size_t i = begin_position; i < end_position; ++i) { |
+ if (query.Evaluate(*at(i))) |
+ ++count; |
+ } |
+ return count; |
+} |
+ |
// TraceAnalyzer |
TraceAnalyzer::TraceAnalyzer() : allow_assocation_changes_(true) { |
@@ -739,6 +855,19 @@ void TraceAnalyzer::AssociateEvents(const Query& first, |
} |
} |
+void TraceAnalyzer::MergeAssociatedEventArgs() { |
+ for (size_t i = 0; i < raw_events_.size(); ++i) { |
+ if (raw_events_[i].other_event) { |
+ raw_events_[i].arg_numbers.insert( |
+ raw_events_[i].other_event->arg_numbers.begin(), |
+ raw_events_[i].other_event->arg_numbers.end()); |
+ raw_events_[i].arg_strings.insert( |
+ raw_events_[i].other_event->arg_strings.begin(), |
+ raw_events_[i].other_event->arg_strings.end()); |
+ } |
+ } |
+} |
+ |
size_t TraceAnalyzer::FindEvents(const Query& query, TraceEventVector* output) { |
allow_assocation_changes_ = false; |
output->clear(); |
@@ -758,41 +887,6 @@ 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]; |