[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