Add cProfile output to --perf-log

This commit is contained in:
Anthony Sottile
2020-02-19 18:42:22 -08:00
parent e0b10e8b9c
commit 75151505a7
2 changed files with 9 additions and 4 deletions

12
babi.py
View File

@@ -1,6 +1,7 @@
import argparse
import collections
import contextlib
import cProfile
import curses
import enum
import functools
@@ -435,21 +436,23 @@ class History:
class Perf:
def __init__(self) -> None:
self.active = False
self._prof: Optional[cProfile.Profile] = None
self._records: List[Tuple[str, float]] = []
self._name: Optional[str] = None
self._time: Optional[float] = None
def start(self, name: str) -> None:
if self.active:
if self._prof:
assert self._name is None, self._name
self._name = name
self._time = time.monotonic()
self._prof.enable()
def end(self) -> None:
if self.active:
if self._prof:
assert self._name is not None
assert self._time is not None
self._prof.disable()
self._records.append((self._name, time.monotonic() - self._time))
self._name = self._time = None
@@ -458,12 +461,13 @@ class Perf:
if filename is None:
yield
else:
self.active = True
self._prof = cProfile.Profile()
self.start('startup')
try:
yield
finally:
self.end()
self._prof.dump_stats(f'{filename}.pstats')
with open(filename, 'w') as f:
f.write('μs\tevent\n')
for name, duration in self._records:

View File

@@ -10,3 +10,4 @@ def test(run, tmpdir, ten_lines):
assert lines[0] == 'μs\tevent'
expected = ['startup', 'KEY_RIGHT', 'KEY_DOWN', '^X']
assert [line.split()[-1] for line in lines[1:]] == expected
assert tmpdir.join('f.log.pstats').exists()