From 39f6d84b792fc78ef5836598150375b289cc47cd Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 10 May 2023 21:24:39 +0200
Subject: [PATCH] Try to reduce amount of times we iterate over a list

---
 gdb-port/parser.py | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/gdb-port/parser.py b/gdb-port/parser.py
index cbdd8c9..5cc5cd5 100644
--- a/gdb-port/parser.py
+++ b/gdb-port/parser.py
@@ -268,6 +268,7 @@ class ParserStack:
 		current_frame_alloc = current_event[1] - previous_event[1]
 		#print("commit_at_pop: current_frame_alloc", current_frame_alloc) # DEBUG
 		pop_allocs = {}
+		parser_cache = {}
 
 		# TODO: clean up
 		if len(ev_list) == 1:
@@ -277,22 +278,28 @@ class ParserStack:
 			self.committed = len(self.stack_events)-1
 		#	print("commit_at_pop: pop_allocs:", { current_event[2].address: current_frame_alloc }) # DEBUG
 			pop_allocs[current_event[2].address] = pop_allocs.get(current_event[2].address, 0) + current_frame_alloc
+			parser_cache[current_event[2].address] = current_event[2]
 		#	return { current_event[2].address: current_frame_alloc }
 		elif len(ev_list) > 1:
-			bytes_list = [ev[1] for ev in ev_list]
+			#bytes_list = [ev[1] for ev in ev_list]
 
-			differences = map(lambda smaller, bigger: bigger-smaller, bytes_list[:-1], bytes_list[1:])
+			#differences = map(lambda smaller, bigger: bigger-smaller, bytes_list[:-1], bytes_list[1:])
+			differences = [bigger[1]-smaller[1] for bigger, smaller in zip(ev_list[1:], ev_list[:-1])]
+			# TODO: this could be a list comprehension too
 			for index, event in enumerate(ev_list[:-1]):
-				alloc = next(differences)
+				parser_cache[int(event[2].address)] = event[2]
+				alloc = differences[index]
+				pop_allocs[event[2].address] = pop_allocs.get(event[2].address, 0) + alloc
+				#alloc = next(differences)
 				#print("commit_at_pop: alloc:", alloc) # DEBUG
 				#print("commit_at_pop: adding to parser", event[2].name, hex(event[2].address))
 				#event[2].add_mem_use(int(self.arena), alloc)
-				pop_allocs[event[2].address] = pop_allocs.get(event[2].address, 0) + alloc
 
 		#print("commit_at_pop: pop_allocs:", pop_allocs) # DEBUG
 		self.unclaimed_mem_use += pop_allocs.pop(0,0) # Account for allocs and remove with no parser, so it doesn't cause problems in the loop below
 		for parser_addr, alloc in pop_allocs.items():
-			top_level_parse.parser_by_address(parser_addr).add_mem_use(int(self.arena), alloc)
+			#top_level_parse.parser_by_address(parser_addr).add_mem_use(int(self.arena), alloc)
+			parser_cache[parser_addr].add_mem_use(int(self.arena), alloc)
 		self.committed = len(self.stack_events)-1
 		return pop_allocs
 
-- 
GitLab