Skip to content

Commit f503dc5

Browse files
committed
perf: collect more stats in sysmon
1 parent 97e68a0 commit f503dc5

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

coverage/collector.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ def pause(self) -> None:
367367
tracer.stop()
368368
stats = tracer.get_stats()
369369
if stats:
370-
print("\nCoverage.py tracer stats:")
370+
print(f"\nCoverage.py {tracer.__class__.__name__} stats:")
371371
for k, v in human_sorted_items(stats.items()):
372372
print(f"{k:>20}: {v}")
373373
if self.threading:

coverage/sysmon.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,10 @@ def __init__(self, tool_id: int) -> None:
369369

370370
self.stats: dict[str, int] | None = None
371371
if COLLECT_STATS:
372-
self.stats = {
373-
"starts": 0,
374-
}
372+
self.stats = dict.fromkeys(
373+
"starts start_tracing returns line_lines line_arcs branches branch_trails".split(),
374+
0,
375+
)
375376

376377
self.stopped = False
377378
self._activity = False
@@ -493,6 +494,8 @@ def sysmon_py_start(
493494
self.code_objects.append(code)
494495

495496
if tracing_code:
497+
if self.stats is not None:
498+
self.stats["start_tracing"] += 1
496499
events = sys.monitoring.events
497500
with self.lock:
498501
if self.sysmon_on:
@@ -516,6 +519,8 @@ def sysmon_py_return(
516519
retval: object,
517520
) -> MonitorReturn:
518521
"""Handle sys.monitoring.events.PY_RETURN events for branch coverage."""
522+
if self.stats is not None:
523+
self.stats["returns"] += 1
519524
code_info = self.code_infos.get(id(code))
520525
if code_info is not None and code_info.file_data is not None:
521526
assert code_info.byte_to_line is not None
@@ -529,6 +534,8 @@ def sysmon_py_return(
529534
@panopticon("code", "line")
530535
def sysmon_line_lines(self, code: CodeType, line_number: TLineNo) -> MonitorReturn:
531536
"""Handle sys.monitoring.events.LINE events for line coverage."""
537+
if self.stats is not None:
538+
self.stats["line_lines"] += 1
532539
code_info = self.code_infos.get(id(code))
533540
if code_info is not None and code_info.file_data is not None:
534541
cast(set[TLineNo], code_info.file_data).add(line_number)
@@ -538,6 +545,8 @@ def sysmon_line_lines(self, code: CodeType, line_number: TLineNo) -> MonitorRetu
538545
@panopticon("code", "line")
539546
def sysmon_line_arcs(self, code: CodeType, line_number: TLineNo) -> MonitorReturn:
540547
"""Handle sys.monitoring.events.LINE events for branch coverage."""
548+
if self.stats is not None:
549+
self.stats["line_arcs"] += 1
541550
code_info = self.code_infos[id(code)]
542551
if code_info.file_data is not None:
543552
arc = (line_number, line_number)
@@ -550,9 +559,13 @@ def sysmon_branch_either(
550559
self, code: CodeType, instruction_offset: TOffset, destination_offset: TOffset
551560
) -> MonitorReturn:
552561
"""Handle BRANCH_RIGHT and BRANCH_LEFT events."""
562+
if self.stats is not None:
563+
self.stats["branches"] += 1
553564
code_info = self.code_infos[id(code)]
554565
if code_info.file_data is not None:
555566
if not code_info.branch_trails:
567+
if self.stats is not None:
568+
self.stats["branch_trails"] += 1
556569
populate_branch_trails(code, code_info)
557570
# log(f"branch_trails for {code}:\n {code_info.branch_trails}")
558571
added_arc = False

0 commit comments

Comments
 (0)