Browse Source

ChannelDB.load_data: add comment re bad performance, and some speed-up

On my machine, ChannelDB.load_data() went from around 6 sec to 4 sec,
just by commenting out that assert in lnmsg.

related #6006
hard-fail-on-bad-server-string
SomberNight 5 years ago
parent
commit
99f736f3e7
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 3
      electrum/channel_db.py
  2. 3
      electrum/lnmsg.py

3
electrum/channel_db.py

@ -581,6 +581,9 @@ class ChannelDB(SqlDB):
@sql @sql
@profiler @profiler
def load_data(self): def load_data(self):
# Note: this method takes several seconds... mostly due to lnmsg.decode_msg being slow.
# I believe lnmsg (and lightning.json) will need a rewrite anyway, so instead of tweaking
# load_data() here, that should be done. see #6006
c = self.conn.cursor() c = self.conn.cursor()
c.execute("""SELECT * FROM address""") c.execute("""SELECT * FROM address""")
for x in c: for x in c:

3
electrum/lnmsg.py

@ -57,14 +57,13 @@ def _make_handler(msg_name: str, v: dict) -> Callable[[bytes], Tuple[str, dict]]
Returns function taking bytes Returns function taking bytes
""" """
def handler(data: bytes) -> Tuple[str, dict]: def handler(data: bytes) -> Tuple[str, dict]:
nonlocal msg_name, v
ma = {} # map of field name -> field data; after parsing msg ma = {} # map of field name -> field data; after parsing msg
pos = 0 pos = 0
for fieldname in v["payload"]: for fieldname in v["payload"]:
poslenMap = v["payload"][fieldname] poslenMap = v["payload"][fieldname]
if "feature" in poslenMap and pos == len(data): if "feature" in poslenMap and pos == len(data):
continue continue
assert pos == _eval_exp_with_ctx(poslenMap["position"], ma) #assert pos == _eval_exp_with_ctx(poslenMap["position"], ma) # this assert is expensive...
length = poslenMap["length"] length = poslenMap["length"]
length = _eval_exp_with_ctx(length, ma) length = _eval_exp_with_ctx(length, ma)
ma[fieldname] = data[pos:pos+length] ma[fieldname] = data[pos:pos+length]

Loading…
Cancel
Save