OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include <set> | 9 #include <set> |
10 | 10 |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 continue; | 810 continue; |
811 std::map<std::string, std::string>::const_iterator string_it = | 811 std::map<std::string, std::string>::const_iterator string_it = |
812 this_event.arg_strings.find("name"); | 812 this_event.arg_strings.find("name"); |
813 if (string_it != this_event.arg_strings.end()) | 813 if (string_it != this_event.arg_strings.end()) |
814 thread_names_[this_event.thread] = string_it->second; | 814 thread_names_[this_event.thread] = string_it->second; |
815 } | 815 } |
816 } | 816 } |
817 | 817 |
818 // TraceEventVector utility functions. | 818 // TraceEventVector utility functions. |
819 | 819 |
820 bool GetRateStats(const TraceEventVector& events, RateStats* stats) { | 820 bool GetRateStats(const TraceEventVector& events, |
| 821 RateStats* stats, |
| 822 const RateStatsOptions* options) { |
821 CHECK(stats); | 823 CHECK(stats); |
822 // Need at least 3 events to calculate rate stats. | 824 // Need at least 3 events to calculate rate stats. |
823 if (events.size() < 3) { | 825 const size_t kMinEvents = 3; |
| 826 if (events.size() < kMinEvents) { |
824 LOG(ERROR) << "Not enough events: " << events.size(); | 827 LOG(ERROR) << "Not enough events: " << events.size(); |
825 return false; | 828 return false; |
826 } | 829 } |
827 | 830 |
828 std::vector<double> deltas; | 831 std::vector<double> deltas; |
829 double delta_sum = 0.0; | |
830 size_t num_deltas = events.size() - 1; | 832 size_t num_deltas = events.size() - 1; |
831 for (size_t i = 0; i < num_deltas; ++i) { | 833 for (size_t i = 0; i < num_deltas; ++i) { |
832 double delta = events.at(i + 1)->timestamp - events.at(i)->timestamp; | 834 double delta = events.at(i + 1)->timestamp - events.at(i)->timestamp; |
833 if (delta < 0.0) { | 835 if (delta < 0.0) { |
834 LOG(ERROR) << "Events are out of order"; | 836 LOG(ERROR) << "Events are out of order"; |
835 return false; | 837 return false; |
836 } | 838 } |
837 deltas.push_back(delta); | 839 deltas.push_back(delta); |
838 delta_sum += delta; | |
839 } | 840 } |
840 | 841 |
| 842 std::sort(deltas.begin(), deltas.end()); |
| 843 |
| 844 if (options) { |
| 845 if (options->trim_min + options->trim_max > events.size() - kMinEvents) { |
| 846 LOG(ERROR) << "Attempt to trim too many events"; |
| 847 return false; |
| 848 } |
| 849 deltas.erase(deltas.begin(), deltas.begin() + options->trim_min); |
| 850 deltas.erase(deltas.end() - options->trim_max, deltas.end()); |
| 851 } |
| 852 |
| 853 num_deltas = deltas.size(); |
| 854 double delta_sum = 0.0; |
| 855 for (size_t i = 0; i < num_deltas; ++i) |
| 856 delta_sum += deltas[i]; |
| 857 |
841 stats->min_us = *std::min_element(deltas.begin(), deltas.end()); | 858 stats->min_us = *std::min_element(deltas.begin(), deltas.end()); |
842 stats->max_us = *std::max_element(deltas.begin(), deltas.end()); | 859 stats->max_us = *std::max_element(deltas.begin(), deltas.end()); |
843 stats->mean_us = delta_sum / static_cast<double>(num_deltas); | 860 stats->mean_us = delta_sum / static_cast<double>(num_deltas); |
844 | 861 |
845 double sum_mean_offsets_squared = 0.0; | 862 double sum_mean_offsets_squared = 0.0; |
846 for (size_t i = 0; i < num_deltas; ++i) { | 863 for (size_t i = 0; i < num_deltas; ++i) { |
847 double offset = fabs(deltas[i] - stats->mean_us); | 864 double offset = fabs(deltas[i] - stats->mean_us); |
848 sum_mean_offsets_squared += offset * offset; | 865 sum_mean_offsets_squared += offset * offset; |
849 } | 866 } |
850 stats->standard_deviation_us = | 867 stats->standard_deviation_us = |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 size_t count = 0u; | 951 size_t count = 0u; |
935 for (size_t i = begin_position; i < end_position; ++i) { | 952 for (size_t i = begin_position; i < end_position; ++i) { |
936 if (query.Evaluate(*events.at(i))) | 953 if (query.Evaluate(*events.at(i))) |
937 ++count; | 954 ++count; |
938 } | 955 } |
939 return count; | 956 return count; |
940 } | 957 } |
941 | 958 |
942 } // namespace trace_analyzer | 959 } // namespace trace_analyzer |
943 | 960 |
OLD | NEW |