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

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: const ref params 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
« no previous file with comments | « base/test/trace_event_analyzer.h ('k') | base/test/trace_event_analyzer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
791 CHECK(stats);
762 // Need at least 3 events to calculate rate stats. 792 // Need at least 3 events to calculate rate stats.
763 if (events.size() < 3) { 793 if (events.size() < 3) {
764 LOG(ERROR) << "Not enough events: " << events.size(); 794 LOG(ERROR) << "Not enough events: " << events.size();
765 return false; 795 return false;
766 } 796 }
767 797
768 std::vector<double> deltas; 798 std::vector<double> deltas;
769 double delta_sum = 0.0; 799 double delta_sum = 0.0;
770 size_t num_deltas = events.size() - 1; 800 size_t num_deltas = events.size() - 1;
771 for (size_t i = 0; i < num_deltas; ++i) { 801 for (size_t i = 0; i < num_deltas; ++i) {
772 double delta = events[i + 1]->timestamp - events[i]->timestamp; 802 double delta = events.at(i + 1)->timestamp - events.at(i)->timestamp;
773 if (delta < 0.0) { 803 if (delta < 0.0) {
774 LOG(ERROR) << "Events are out of order"; 804 LOG(ERROR) << "Events are out of order";
775 return false; 805 return false;
776 } 806 }
777 deltas.push_back(delta); 807 deltas.push_back(delta);
778 delta_sum += delta; 808 delta_sum += delta;
779 } 809 }
780 810
781 stats->min_us = *std::min_element(deltas.begin(), deltas.end()); 811 stats->min_us = *std::min_element(deltas.begin(), deltas.end());
782 stats->max_us = *std::max_element(deltas.begin(), deltas.end()); 812 stats->max_us = *std::max_element(deltas.begin(), deltas.end());
783 stats->mean_us = delta_sum / static_cast<double>(num_deltas); 813 stats->mean_us = delta_sum / static_cast<double>(num_deltas);
784 814
785 double sum_mean_offsets_squared = 0.0; 815 double sum_mean_offsets_squared = 0.0;
786 for (size_t i = 0; i < num_deltas; ++i) { 816 for (size_t i = 0; i < num_deltas; ++i) {
787 double offset = fabs(deltas[i] - stats->mean_us); 817 double offset = fabs(deltas[i] - stats->mean_us);
788 sum_mean_offsets_squared += offset * offset; 818 sum_mean_offsets_squared += offset * offset;
789 } 819 }
790 stats->standard_deviation_us = 820 stats->standard_deviation_us =
791 sum_mean_offsets_squared / static_cast<double>(num_deltas - 1); 821 sum_mean_offsets_squared / static_cast<double>(num_deltas - 1);
792 822
793 return true; 823 return true;
794 } 824 }
795 825
796 void TraceAnalyzer::ParseMetadata() { 826 bool FindFirstOf(const TraceEventVector& events,
797 for (size_t i = 0; i < raw_events_.size(); ++i) { 827 const Query& query,
798 TraceEvent& this_event = raw_events_[i]; 828 size_t position,
799 // Check for thread name metadata. 829 size_t* return_index) {
800 if (this_event.phase != TRACE_EVENT_PHASE_METADATA || 830 CHECK(return_index);
801 this_event.name != "thread_name") 831 for (size_t i = position; i < events.size(); ++i) {
832 if (query.Evaluate(*events.at(i))) {
833 *return_index = i;
834 return true;
835 }
836 }
837 return false;
838 }
839
840 bool FindLastOf(const TraceEventVector& events,
841 const Query& query,
842 size_t position,
843 size_t* return_index) {
844 CHECK(return_index);
845 if (events.empty())
846 return false;
847 position = (position < events.size()) ? position : events.size() - 1;
848 for (;;) {
849 if (query.Evaluate(*events.at(position))) {
850 *return_index = position;
851 return true;
852 }
853 if (position == 0)
854 return false;
855 --position;
856 }
857 return false;
858 }
859
860 bool FindClosest(const TraceEventVector& events,
861 const Query& query,
862 size_t position,
863 size_t* return_closest,
864 size_t* return_second_closest) {
865 CHECK(return_closest);
866 if (events.empty() || position >= events.size())
867 return false;
868 size_t closest = events.size();
869 size_t second_closest = events.size();
870 for (size_t i = 0; i < events.size(); ++i) {
871 if (!query.Evaluate(*events.at(i)))
802 continue; 872 continue;
803 std::map<std::string, std::string>::const_iterator string_it = 873 if (closest == events.size()) {
804 this_event.arg_strings.find("name"); 874 closest = i;
805 if (string_it != this_event.arg_strings.end()) 875 continue;
806 thread_names_[this_event.thread] = string_it->second; 876 }
877 if (fabs(events.at(i)->timestamp - events.at(position)->timestamp) <
878 fabs(events.at(closest)->timestamp - events.at(position)->timestamp)) {
879 second_closest = closest;
880 closest = i;
881 } else if (second_closest == events.size()) {
882 second_closest = i;
883 }
807 } 884 }
885
886 if (closest < events.size() &&
887 (!return_second_closest || second_closest < events.size())) {
888 *return_closest = closest;
889 if (return_second_closest)
890 *return_second_closest = second_closest;
891 return true;
892 }
893
894 return false;
895 }
896
897 size_t CountMatches(const TraceEventVector& events,
898 const Query& query,
899 size_t begin_position,
900 size_t end_position) {
901 if (begin_position >= events.size())
902 return 0u;
903 end_position = (end_position < events.size()) ? end_position : events.size();
904 size_t count = 0u;
905 for (size_t i = begin_position; i < end_position; ++i) {
906 if (query.Evaluate(*events.at(i)))
907 ++count;
908 }
909 return count;
808 } 910 }
809 911
810 } // namespace trace_analyzer 912 } // namespace trace_analyzer
811 913
OLDNEW
« no previous file with comments | « base/test/trace_event_analyzer.h ('k') | base/test/trace_event_analyzer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698