diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2021-10-14 20:03:20 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2021-10-14 20:03:20 -0400 |
commit | ec9070f1387e9713236f3b8c47447df44447df23 (patch) | |
tree | 7e88dde62527a0f9a8595e97776346b5f63d5b58 /coverage/collector.py | |
parent | a1101953f253754514e74d3d648c4d4ef9c0ad6c (diff) | |
download | python-coveragepy-git-ec9070f1387e9713236f3b8c47447df44447df23.tar.gz |
perf: reduce the overhead of recording branches
Diffstat (limited to 'coverage/collector.py')
-rw-r--r-- | coverage/collector.py | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/coverage/collector.py b/coverage/collector.py index 733b6f32..a72129e2 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -157,9 +157,11 @@ class Collector: if self._trace_class is CTracer: self.file_disposition_class = CFileDisposition self.supports_plugins = True + self.packed_arcs = True else: self.file_disposition_class = FileDisposition self.supports_plugins = False + self.packed_arcs = False def __repr__(self): return f"<Collector at 0x{id(self):x}: {self.tracer_name()}>" @@ -437,7 +439,25 @@ class Collector: return False if self.branch: - self.covdata.add_arcs(self.mapped_file_dict(self.data)) + if self.packed_arcs: + # Unpack the line number pairs packed into integers. See + # tracer.c:CTracer_record_pair for the C code that creates + # these packed ints. + data = {} + for fname, packeds in self.data.items(): + tuples = [] + for packed in packeds: + l1 = packed & 0xFFFFF + l2 = (packed & (0xFFFFF << 20)) >> 20 + if packed & (1 << 40): + l1 *= -1 + if packed & (1 << 41): + l2 *= -1 + tuples.append((l1, l2)) + data[fname] = tuples + else: + data = self.data + self.covdata.add_arcs(self.mapped_file_dict(data)) else: self.covdata.add_lines(self.mapped_file_dict(self.data)) |