mirror of
https://github.com/apache/nuttx.git
synced 2026-05-30 21:36:28 +08:00
pynuttx: optimize memory leak check by skipping previously checked pointers
Reduce leak analysis time from 12s to 7.8s, achieving a 35% performance improvement that tested on an internal project. 1. Use memoryview to avoid creating int objects, reducing overhead 2. Store checked pointers in a dictionary for efficient lookups, improving performance. 3. While dictionary operations have some cost, the overall speedup is significant. Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
This commit is contained in:
committed by
Alan C. Assis
parent
b90638493a
commit
04bd00f80a
@@ -131,19 +131,34 @@ class MMLeak(gdb.Command):
|
|||||||
|
|
||||||
longsize = utils.get_long_type().sizeof
|
longsize = utils.get_long_type().sizeof
|
||||||
|
|
||||||
|
checked_ptr = {}
|
||||||
|
|
||||||
def pointers(node: memdump.MMNodeDump) -> Generator[int, None, None]:
|
def pointers(node: memdump.MMNodeDump) -> Generator[int, None, None]:
|
||||||
# Return all possible pointers stored in this node
|
# Return all possible pointers stored in this node
|
||||||
size = node.nodesize - node.overhead
|
size = node.nodesize - node.overhead
|
||||||
memory = node.read_memory()
|
memory = node.read_memory()
|
||||||
|
prev_mem = None
|
||||||
while size > 0:
|
while size > 0:
|
||||||
size -= longsize
|
size -= longsize
|
||||||
ptr = int.from_bytes(memory[size : size + longsize], "little")
|
mem = memory[size : size + longsize]
|
||||||
|
if mem == prev_mem:
|
||||||
|
continue
|
||||||
|
|
||||||
|
prev_mem = mem
|
||||||
|
ptr = int.from_bytes(mem, "little")
|
||||||
|
if ptr in checked_ptr:
|
||||||
|
continue
|
||||||
|
|
||||||
|
checked_ptr[ptr] = True
|
||||||
|
|
||||||
if any(region["start"] <= ptr < region["end"] for region in regions):
|
if any(region["start"] <= ptr < region["end"] for region in regions):
|
||||||
yield ptr
|
yield ptr
|
||||||
|
|
||||||
print("Leak analyzing...", flush=True, end="")
|
print("Leak analyzing...", flush=True, end="")
|
||||||
t = time.time()
|
t = time.time()
|
||||||
for good in good_nodes:
|
for good in good_nodes:
|
||||||
|
if not sorted_addr: # All nodes are checked
|
||||||
|
break
|
||||||
for ptr in pointers(good):
|
for ptr in pointers(good):
|
||||||
if not (idx := bisect.bisect_right(sorted_addr, ptr)):
|
if not (idx := bisect.bisect_right(sorted_addr, ptr)):
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in New Issue
Block a user