diff options
author | Yabin Cui <yabinc@google.com> | 2015-07-23 21:39:57 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2015-07-24 10:20:36 -0700 |
commit | 73d8078e6e5ef92b2301386ce96260bd99efacbb (patch) | |
tree | 224794793fe56c614ad14fb2e1541f492479ff42 /simpleperf/record_file_reader.cpp | |
parent | 47efd84444cec06d79e2f53e4b2bb9a075b40e02 (diff) | |
download | extras-73d8078e6e5ef92b2301386ce96260bd99efacbb.tar.gz |
Simpleperf: use ThreadTree when getting hit files in record command.
The new method is more accurate and has lower time complexity.
Bug: 22229391
Change-Id: I8b3016798b8a0e20335adeb7ec5dda0068044142
Diffstat (limited to 'simpleperf/record_file_reader.cpp')
-rw-r--r-- | simpleperf/record_file_reader.cpp | 41 |
1 files changed, 3 insertions, 38 deletions
diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp index 5336b80d..8e61aa0a 100644 --- a/simpleperf/record_file_reader.cpp +++ b/simpleperf/record_file_reader.cpp @@ -110,47 +110,12 @@ std::vector<uint64_t> RecordFileReader::IdsForAttr(const FileAttr* attr) { return result; } -static bool IsRecordHappensBefore(const std::unique_ptr<const Record>& r1, - const std::unique_ptr<const Record>& r2) { - bool is_r1_sample = (r1->header.type == PERF_RECORD_SAMPLE); - bool is_r2_sample = (r2->header.type == PERF_RECORD_SAMPLE); - uint64_t time1 = (is_r1_sample ? static_cast<const SampleRecord*>(r1.get())->time_data.time - : r1->sample_id.time_data.time); - uint64_t time2 = (is_r2_sample ? static_cast<const SampleRecord*>(r2.get())->time_data.time - : r2->sample_id.time_data.time); - // The record with smaller time happens first. - if (time1 != time2) { - return time1 < time2; - } - // If happening at the same time, make non-sample records before sample records, - // because non-sample records may contain useful information to parse sample records. - if (is_r1_sample != is_r2_sample) { - return is_r1_sample ? false : true; - } - // Otherwise, don't care of the order. - return false; -} - -std::vector<std::unique_ptr<const Record>> RecordFileReader::DataSection() { - std::vector<std::unique_ptr<const Record>> result; +std::vector<std::unique_ptr<Record>> RecordFileReader::DataSection() { const struct FileHeader* header = FileHeader(); auto file_attrs = AttrSection(); CHECK(file_attrs.size() > 0); - perf_event_attr attr = file_attrs[0]->attr; - - const char* end = mmap_addr_ + header->data.offset + header->data.size; - const char* p = mmap_addr_ + header->data.offset; - while (p < end) { - const perf_event_header* header = reinterpret_cast<const perf_event_header*>(p); - if (p + header->size <= end) { - result.push_back(ReadRecordFromBuffer(attr, header)); - } - p += header->size; - } - if ((attr.sample_type & PERF_SAMPLE_TIME) && attr.sample_id_all) { - std::sort(result.begin(), result.end(), IsRecordHappensBefore); - } - return result; + return ReadRecordsFromBuffer(file_attrs[0]->attr, mmap_addr_ + header->data.offset, + header->data.size); } const std::map<int, SectionDesc>& RecordFileReader::FeatureSectionDescriptors() { |