Projet

Général

Profil

Development #77252

divers performance inspect

Ajouté par Frédéric Péters il y a 12 mois. Mis à jour il y a 12 mois.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
03 mai 2023
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

En partant du cas particulier de #77066, une demande dont la vue /inspect est inaccessible à cause de timeout, quelques recherches.

1/

  • mesure de substvars.get_flat_keys(), base de départ : 37 secondes
  • masse de requêtes SQL répétées pour les rôles (plusieurs centaines), via get_workflow_roles_substitution_variables(),
    • en neutralisant cette fonction (remplacée par un return {}), la durée passe à 30 secondes
    • sans doute facile d'ajouter un petit cache par requête à la fin de get_workflow_roles_substitution_variables

2/

  • on part du dernier point, mais avec cProfile.Profile() activé, base de départ (overhead du profiling) : 46 secondes
  • temps cumulé : 7 secondes sur get_default_workflow (un cache pourrait être ajouté ici, ne pas reconstruire l'objet 9846 fois)

3/

  • temps cumulé : 33 secondes sur iter_evolution_parts, qui est appelé 89479× sur le formdata (+ quelques dizaines de fois sur des fiches liées)
    • la plupart de ces appels viennent de wcs/wf/form.py, LazyFormDataWorkflowForms.__getattr__
    • il y aurait à garder en cache les noms d'attribut possible, avec ça le temps cumulé ici passe à 5,5 secondes,
    def __getattr__(self, varname):
        wfform_formdatas = []
+       if '_varnames' in self.__dict__:
+           varnames = self.__dict__['_varnames']
+           if varname not in varnames:
+               raise AttributeError(varname)
+       else:
+           self.__dict__['_varnames'] = varnames = set()
        for part in self._formdata.iter_evolution_parts():
            if not isinstance(part, WorkflowFormEvolutionPart):
                continue
+           varnames.add(part.varname)
            if part.varname == varname and part.data:
                wfform_formdatas.append(LazyFormDataWorkflowFormsItem(part, base_formdata=self._formdata))
        if wfform_formdatas:
            return LazyFormDataWorkflowFormsItems(wfform_formdatas)
        raise AttributeError(varname)

Tout ça mis ensemble les 37 secondes doivent pouvoir descendre à moins de 10 secondes.

Révisions associées

Révision c46f50a6 (diff)
Ajouté par Frédéric Péters il y a 12 mois

perfs: add attribute name cache to lazy workflow form data (#77252)

Révision f84dbf7f (diff)
Ajouté par Frédéric Péters il y a 12 mois

storage: add simple caching (#77252)

Révision d0b178bb (diff)
Ajouté par Frédéric Péters il y a 12 mois

formdef: also cache default workflow (#77252)

Historique

#1

Mis à jour par Robot Gitea il y a 12 mois

  • Statut changé de Nouveau à En cours

Frédéric Péters (fpeters) a ouvert une pull request sur Gitea concernant cette demande :

#2

Mis à jour par Robot Gitea il y a 12 mois

  • Statut changé de En cours à Solution proposée
#3

Mis à jour par Robot Gitea il y a 12 mois

  • Statut changé de Solution proposée à Solution validée

Lauréline Guérin (lguerin) a approuvé une pull request sur Gitea concernant cette demande :

#4

Mis à jour par Robot Gitea il y a 12 mois

  • Statut changé de Solution validée à Résolu (à déployer)

Frédéric Péters (fpeters) a mergé une pull request sur Gitea concernant cette demande :

#5

Mis à jour par Transition automatique il y a 12 mois

  • Statut changé de Résolu (à déployer) à Solution déployée
#6

Mis à jour par Transition automatique il y a 10 mois

Automatic expiration

Formats disponibles : Atom PDF