Add cProfile output to --perf-log
This commit is contained in:
12
babi.py
12
babi.py
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user