[Patchew-devel] [PATCH] optimize mod
Paolo Bonzini
pbonzini at redhat.com
Tue Nov 20 18:22:41 UTC 2018
On 20/11/18 02:33, Fam Zheng wrote:
> On Mon, 11/19 17:01, Paolo Bonzini wrote:
>> On 19/11/18 14:38, Paolo Bonzini wrote:
>>> 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>
>>
>> Hmm, this undoes thw "Always read from DB to accept configuration
>> updates" part, because .enabled() also comes from the DB.
>>
>> One idea could be to cache enabled() every time a module is saved.
>>
>> By the way, the enabled() check already doesn't work for the
>> www_url_hook, which is run only ones. More precisely, it only works
>> because modules are default-enabled.
>
> I'm in favor of dropping the enabled field from the model if it has a
> performance advantage.
Ok.
>>> 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:
>
> Nit: I think PEP wants 'hook_name not in ...'?
Yep.
Paolo
More information about the Patchew-devel
mailing list