Projet

Général

Profil

Bug #46854

perf rendu /inspect (clés _live_)

Ajouté par Frédéric Péters il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
21 septembre 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non


Fichiers

Révisions associées

Révision eff8a6cb (diff)
Ajouté par Frédéric Péters il y a plus de 3 ans

perf: cache live access data during request (#46854)

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 3 ans

A priori pas lié à cette nouvelle section (un for x in formdata.iter_target_datas(): print(x) de test est tout à fait rapide).

#2

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Sujet changé de perf rendu /inspect (parce que demandes et fiches liées ?) à perf rendu /inspect (clés _live_)
  • Assigné à mis à Frédéric Péters

En faisant

        print('[%.2f] getting flat keys' % (time.time() - t0), file=fd)
        keys = substvars.get_flat_keys()
        print('[%.2f] getting flat keys -- done' % (time.time() - t0), file=fd)
        print('[%.2f] iterating on flat keys' % (time.time() - t0), file=fd)
        for k in sorted(keys):
            [...]
        print('[%.2f] iterating on flat keys -- done' % (time.time() - t0), file=fd)

Ça donne :

[0.08] getting flat keys
[9.57] getting flat keys -- done
[9.57] iterating on flat keys
[22.12] iterating on flat keys -- done

Mon idée est maintenant de regarder dans les clés live, qui parfois s'enchainent (ex: form_var_fiche_senior_live_var_conjoint_senior_live_role_editeur_des_quotas_emails), sans elles, ça se passe ainsi :

[0.08] getting flat keys
[0.34] getting flat keys -- done
[0.34] iterating on flat keys
[0.62] iterating on flat keys -- done

(mesuré en retirant le "live" du inspect_keys)

Vu que dans le live il y a chargement carddef + carddata,

            carddef = CardDef.get_by_urlname(self._field.data_source['type'][8:])
            carddata = carddef.data_class().get(self.raw)

ça n'est au final pas bien surprenant.

Il y aurait moyen de faire un get_request().live_card_cache à l'image des datasources_cache et wscalls_cache, avec '%s-%s' % (self._field.data_source['type'], self.raw) comme clé, pour voir.

#3

Mis à jour par Frédéric Péters il y a plus de 3 ans

[0.07] getting flat keys
[0.77] getting flat keys -- done
[0.77] iterating on flat keys
[1.43] iterating on flat keys -- done
#4

Mis à jour par Frédéric Péters il y a plus de 3 ans

Ces mesures avec le patch attaché (toutes les mesures effectuées sur wcs.node1.test).

#7

Mis à jour par Thomas Noël il y a plus de 3 ans

Je vois bien que cette partie du code fonctionne :

            # cache during request
            if not hasattr(request, 'live_card_cache'):
                request.live_card_cache = {}
            cache_key = '%s-%s' % (self._field.data_source['type'], self.raw)
            carddata = request.live_card_cache.get(cache_key)
            if carddata is not None:
                if isinstance(carddata, Exception):
                    raise carddata
                return LazyFormData(carddata)

mais peut-être que je suis trop vieux, j'aurais ajouté un else au cas où le cache n'est pas encore là, comme :

            # cache during request
            cache_key = '%s-%s' % (self._field.data_source['type'], self.raw)
            if not hasattr(request, 'live_card_cache'):
                request.live_card_cache = {}
            else:
                carddata = request.live_card_cache.get(cache_key)
                if carddata is not None:
                    if isinstance(carddata, Exception):
                        raise carddata
                    return LazyFormData(carddata)

Ensuite concernant le test il y a un truc qui m'échappe : il fonctionne aussi très bien sans cache... Que teste-t-on exactement en demandant deux fois context['form_var_foo_live_name'] ?

#8

Mis à jour par Frédéric Péters il y a plus de 3 ans

Ensuite concernant le test il y a un truc qui m'échappe : il fonctionne aussi très bien sans cache...

Oui, c'est qu'idéalement il y aurait mock/whatever et pouvoir vérifier qu'il n'y a pas d'appel, mais au final trop galère.

#9

Mis à jour par Frédéric Péters il y a plus de 3 ans

Modification poussée dans la branche + aussi mock dans le test (pour juste la partie KeyError en fait ça va) pour voir que get_by_urlname n'est pas appelé la seconde fois.

#10

Mis à jour par Thomas Noël il y a plus de 3 ans

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

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit eff8a6cb48d9826e62706bc497cd32ac92acbfef
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Mon Sep 21 20:01:41 2020 +0200

    perf: cache live access data during request (#46854)
#12

Mis à jour par Frédéric Péters il y a plus de 3 ans

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

Formats disponibles : Atom PDF