LogReader: wrap events to cache which() (#35882)

* speed up lr

* lazy caching

* clean up

* it fast

* stash

* stash

* chatgpt code is bad as usual

* clean up

* clean up

* clean up

* clean up

* clean up

* clean up

* match behavior

* cmt
pull/35886/head
Shane Smiskol 5 days ago committed by GitHub
parent cb5299be5a
commit 0ebee55050
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 31
      tools/lib/logreader.py

@ -50,8 +50,35 @@ def decompress_stream(data: bytes):
return decompressed_data
class CachedReader:
__slots__ = ("_evt", "_enum")
def __init__(self, evt: capnp._DynamicStructReader):
"""All capnp attribute accesses are expensive, and which() is often called multiple times"""
self._evt = evt
self._enum: str | None = None
def __repr__(self):
return self._evt.__repr__()
def __str__(self):
return self._evt.__str__()
def __dir__(self):
return dir(self._evt)
def which(self) -> str:
if self._enum is None:
self._enum = self._evt.which()
return self._enum
def __getattr__(self, name: str):
return getattr(self._evt, name)
class _LogFileReader:
def __init__(self, fn, canonicalize=True, only_union_types=False, sort_by_time=False, dat=None):
def __init__(self, fn, only_union_types=False, sort_by_time=False, dat=None):
self.data_version = None
self._only_union_types = only_union_types
@ -76,7 +103,7 @@ class _LogFileReader:
self._ents = []
try:
for e in ents:
self._ents.append(e)
self._ents.append(CachedReader(e))
except capnp.KjException:
warnings.warn("Corrupted events detected", RuntimeWarning, stacklevel=1)

Loading…
Cancel
Save