[Patchew-devel] [PATCH] optimize mod
Paolo Bonzini
pbonzini at redhat.com
Mon Nov 19 13:38:35 UTC 2018
Avoid looking up the module table repeatedly every time a hook is invoked,
by memoizing the list of hooks. As a small additional optimization reuse
the result of get_or_create instead of querying the table again.
Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
mod.py | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/mod.py b/mod.py
index e92377a..1da12ec 100644
--- a/mod.py
+++ b/mod.py
@@ -26,8 +26,7 @@ class PatchewModule(object):
def get_model(self):
# ALways read from DB to accept configuration update in-flight
from api.models import Module as PC
- _module_init_config(self.__class__)
- return PC.objects.get(name=self.name)
+ return _module_init_config(self.__class__)
def enabled(self):
try:
@@ -186,14 +185,20 @@ def load_modules():
_loaded_modules[cls.name] = cls()
print("Loaded module:", cls.name)
+memoized_hooks = {}
def dispatch_module_hook(hook_name, **params):
- for i in [x for x in list(_loaded_modules.values()) if x.enabled()]:
- if hasattr(i, hook_name):
- try:
- getattr(i, hook_name)(**params)
- except:
- print("Cannot invoke module hook: %s.%s" % (i, hook_name))
- traceback.print_exc()
+ if not hook_name in memoized_hooks:
+ # The dictionary stores "bound method" objects
+ memoized_hooks[hook_name] = [getattr(x, hook_name)
+ for x in list(_loaded_modules.values())
+ if x.enabled()
+ and hasattr(x, hook_name)]
+ for f in memoized_hooks[hook_name]:
+ try:
+ f(**params)
+ except:
+ print("Cannot invoke module hook: %s.%s" % (type(f.__self__), hook_name))
+ traceback.print_exc()
def get_module(name):
return _loaded_modules.get(name)
--
2.19.1
More information about the Patchew-devel
mailing list