summaryrefslogtreecommitdiff
path: root/simpleperf/record_file_reader.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2015-07-23 21:39:57 -0700
committerYabin Cui <yabinc@google.com>2015-07-24 10:20:36 -0700
commit73d8078e6e5ef92b2301386ce96260bd99efacbb (patch)
tree224794793fe56c614ad14fb2e1541f492479ff42 /simpleperf/record_file_reader.cpp
parent47efd84444cec06d79e2f53e4b2bb9a075b40e02 (diff)
downloadextras-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.cpp41
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() {