Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(427)

Side by Side Diff: base/test/trace_event_analyzer.cc

Issue 8900001: Add searching features to new TraceEventVector class for tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: phadran feedback Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/test/trace_event_analyzer.h" 5 #include "base/test/trace_event_analyzer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <math.h> 8 #include <math.h>
9 9
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 number_(0) { 608 number_(0) {
609 type_ = (unary_op < OP_ADD ? 609 type_ = (unary_op < OP_ADD ?
610 QUERY_BOOLEAN_OPERATOR : QUERY_ARITHMETIC_OPERATOR); 610 QUERY_BOOLEAN_OPERATOR : QUERY_ARITHMETIC_OPERATOR);
611 } 611 }
612 612
613 namespace { 613 namespace {
614 614
615 // Search |events| for |query| and add matches to |output|. 615 // Search |events| for |query| and add matches to |output|.
616 size_t FindMatchingEvents(const std::vector<TraceEvent>& events, 616 size_t FindMatchingEvents(const std::vector<TraceEvent>& events,
617 const Query& query, 617 const Query& query,
618 TraceAnalyzer::TraceEventVector* output) { 618 TraceEventVector* output) {
619 for (size_t i = 0; i < events.size(); ++i) { 619 for (size_t i = 0; i < events.size(); ++i) {
620 if (query.Evaluate(events[i])) 620 if (query.Evaluate(events[i]))
621 output->push_back(&events[i]); 621 output->push_back(&events[i]);
622 } 622 }
623 return output->size(); 623 return output->size();
624 } 624 }
625 625
626 bool ParseEventsFromJson(const std::string& json, 626 bool ParseEventsFromJson(const std::string& json,
627 std::vector<TraceEvent>* output) { 627 std::vector<TraceEvent>* output) {
628 scoped_ptr<base::Value> root; 628 scoped_ptr<base::Value> root;
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 break; 732 break;
733 } 733 }
734 734
735 // Not a match, restore original other and continue. 735 // Not a match, restore original other and continue.
736 begin_event.other_event = other_backup; 736 begin_event.other_event = other_backup;
737 } 737 }
738 } 738 }
739 } 739 }
740 } 740 }
741 741
742 void TraceAnalyzer::MergeAssociatedEventArgs() {
743 for (size_t i = 0; i < raw_events_.size(); ++i) {
744 if (raw_events_[i].other_event) {
745 raw_events_[i].arg_numbers.insert(
746 raw_events_[i].other_event->arg_numbers.begin(),
747 raw_events_[i].other_event->arg_numbers.end());
748 raw_events_[i].arg_strings.insert(
749 raw_events_[i].other_event->arg_strings.begin(),
750 raw_events_[i].other_event->arg_strings.end());
751 }
752 }
753 }
754
742 size_t TraceAnalyzer::FindEvents(const Query& query, TraceEventVector* output) { 755 size_t TraceAnalyzer::FindEvents(const Query& query, TraceEventVector* output) {
743 allow_assocation_changes_ = false; 756 allow_assocation_changes_ = false;
744 output->clear(); 757 output->clear();
745 return FindMatchingEvents(raw_events_, query, output); 758 return FindMatchingEvents(raw_events_, query, output);
746 } 759 }
747 760
748 const TraceEvent* TraceAnalyzer::FindOneEvent(const Query& query) { 761 const TraceEvent* TraceAnalyzer::FindOneEvent(const Query& query) {
749 TraceEventVector output; 762 TraceEventVector output;
750 if (FindEvents(query, &output) > 0) 763 if (FindEvents(query, &output) > 0)
751 return output.front(); 764 return output.front();
752 return NULL; 765 return NULL;
753 } 766 }
754 767
755 const std::string& TraceAnalyzer::GetThreadName( 768 const std::string& TraceAnalyzer::GetThreadName(
756 const TraceEvent::ProcessThreadID& thread) { 769 const TraceEvent::ProcessThreadID& thread) {
757 // If thread is not found, just add and return empty string. 770 // If thread is not found, just add and return empty string.
758 return thread_names_[thread]; 771 return thread_names_[thread];
759 } 772 }
760 773
761 bool TraceAnalyzer::GetRateStats(const TraceEventVector& events, Stats* stats) { 774 void TraceAnalyzer::ParseMetadata() {
775 for (size_t i = 0; i < raw_events_.size(); ++i) {
776 TraceEvent& this_event = raw_events_[i];
777 // Check for thread name metadata.
778 if (this_event.phase != TRACE_EVENT_PHASE_METADATA ||
779 this_event.name != "thread_name")
780 continue;
781 std::map<std::string, std::string>::const_iterator string_it =
782 this_event.arg_strings.find("name");
783 if (string_it != this_event.arg_strings.end())
784 thread_names_[this_event.thread] = string_it->second;
785 }
786 }
787
788 // TraceEventVector utility functions.
789
790 bool GetRateStats(const TraceEventVector& events, RateStats* stats) {
762 // Need at least 3 events to calculate rate stats. 791 // Need at least 3 events to calculate rate stats.
Zhenyao Mo 2011/12/12 22:30:13 CHECK(stats);
jbates 2011/12/12 22:54:42 Done.
763 if (events.size() < 3) { 792 if (events.size() < 3) {
764 LOG(ERROR) << "Not enough events: " << events.size(); 793 LOG(ERROR) << "Not enough events: " << events.size();
765 return false; 794 return false;
766 } 795 }
767 796
768 std::vector<double> deltas; 797 std::vector<double> deltas;
769 double delta_sum = 0.0; 798 double delta_sum = 0.0;
770 size_t num_deltas = events.size() - 1; 799 size_t num_deltas = events.size() - 1;
771 for (size_t i = 0; i < num_deltas; ++i) { 800 for (size_t i = 0; i < num_deltas; ++i) {
772 double delta = events[i + 1]->timestamp - events[i]->timestamp; 801 double delta = events.at(i + 1)->timestamp - events.at(i)->timestamp;
773 if (delta < 0.0) { 802 if (delta < 0.0) {
774 LOG(ERROR) << "Events are out of order"; 803 LOG(ERROR) << "Events are out of order";
775 return false; 804 return false;
776 } 805 }
777 deltas.push_back(delta); 806 deltas.push_back(delta);
778 delta_sum += delta; 807 delta_sum += delta;
779 } 808 }
780 809
781 stats->min_us = *std::min_element(deltas.begin(), deltas.end()); 810 stats->min_us = *std::min_element(deltas.begin(), deltas.end());
782 stats->max_us = *std::max_element(deltas.begin(), deltas.end()); 811 stats->max_us = *std::max_element(deltas.begin(), deltas.end());
783 stats->mean_us = delta_sum / static_cast<double>(num_deltas); 812 stats->mean_us = delta_sum / static_cast<double>(num_deltas);
784 813
785 double sum_mean_offsets_squared = 0.0; 814 double sum_mean_offsets_squared = 0.0;
786 for (size_t i = 0; i < num_deltas; ++i) { 815 for (size_t i = 0; i < num_deltas; ++i) {
787 double offset = fabs(deltas[i] - stats->mean_us); 816 double offset = fabs(deltas[i] - stats->mean_us);
788 sum_mean_offsets_squared += offset * offset; 817 sum_mean_offsets_squared += offset * offset;
789 } 818 }
790 stats->standard_deviation_us = 819 stats->standard_deviation_us =
791 sum_mean_offsets_squared / static_cast<double>(num_deltas - 1); 820 sum_mean_offsets_squared / static_cast<double>(num_deltas - 1);
792 821
793 return true; 822 return true;
794 } 823 }
795 824
796 void TraceAnalyzer::ParseMetadata() { 825 bool FindFirstOf(const TraceEventVector& events,
797 for (size_t i = 0; i < raw_events_.size(); ++i) { 826 Query query,
798 TraceEvent& this_event = raw_events_[i]; 827 size_t position,
799 // Check for thread name metadata. 828 size_t* return_index) {
800 if (this_event.phase != TRACE_EVENT_PHASE_METADATA || 829 for (size_t i = position; i < events.size(); ++i) {
801 this_event.name != "thread_name") 830 if (query.Evaluate(*events.at(i))) {
831 *return_index = i;
Zhenyao Mo 2011/12/12 22:30:13 You should CHECK(return_index) before using it.
jbates 2011/12/12 22:54:42 Done.
832 return true;
833 }
834 }
835 return false;
836 }
837
838 bool FindLastOf(const TraceEventVector& events,
839 Query query,
840 size_t position,
841 size_t* return_index) {
842 if (events.empty())
843 return false;
844 position = (position < events.size()) ? position : events.size() - 1;
845 for (;;) {
846 if (query.Evaluate(*events.at(position))) {
847 *return_index = position;
Zhenyao Mo 2011/12/12 22:30:13 CHECK(return_index)
jbates 2011/12/12 22:54:42 Done.
848 return true;
849 }
850 if (position == 0)
851 return false;
852 --position;
853 }
854 return false;
855 }
856
857 bool FindClosest(const TraceEventVector& events,
858 Query query,
859 size_t position,
860 size_t* return_closest,
861 size_t* return_second_closest) {
862 if (events.empty() || position >= events.size())
863 return false;
864 size_t closest = events.size();
865 size_t second_closest = events.size();
866 for (size_t i = 0; i < events.size(); ++i) {
867 if (!query.Evaluate(*events.at(i)))
802 continue; 868 continue;
803 std::map<std::string, std::string>::const_iterator string_it = 869 if (closest == events.size()) {
804 this_event.arg_strings.find("name"); 870 closest = i;
805 if (string_it != this_event.arg_strings.end()) 871 continue;
806 thread_names_[this_event.thread] = string_it->second; 872 }
873 if (fabs(events.at(i)->timestamp - events.at(position)->timestamp) <
874 fabs(events.at(closest)->timestamp - events.at(position)->timestamp)) {
875 second_closest = closest;
876 closest = i;
877 } else if (second_closest == events.size()) {
878 second_closest = i;
879 }
807 } 880 }
881
882 if (closest < events.size() &&
883 (!return_second_closest || second_closest < events.size())) {
884 *return_closest = closest;
Zhenyao Mo 2011/12/12 22:30:13 CHECK(return_closest);
jbates 2011/12/12 22:54:42 Done.
885 if (return_second_closest)
886 *return_second_closest = second_closest;
887 return true;
888 }
889
890 return false;
891 }
892
893 size_t CountMatches(const TraceEventVector& events,
894 Query query,
895 size_t begin_position,
896 size_t end_position) {
897 if (begin_position >= events.size())
898 return 0u;
899 end_position = (end_position < events.size()) ? end_position : events.size();
900 size_t count = 0u;
901 for (size_t i = begin_position; i < end_position; ++i) {
902 if (query.Evaluate(*events.at(i)))
903 ++count;
904 }
905 return count;
808 } 906 }
809 907
810 } // namespace trace_analyzer 908 } // namespace trace_analyzer
811 909
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698