Projet

Général

Profil

Development #26139

lenteur sur une page avec des sources de données (Python) + conditions de sortie + condition d'entrée sur la page suivante

Ajouté par Thomas Noël il y a plus de 5 ans. Mis à jour il y a 10 mois.

Statut:
Fermé
Priorité:
Bas
Assigné à:
Version cible:
-
Début:
05 septembre 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

(vu avec Brice)

Cas d'un formulaire assez classique avec 2 pages:
  • une première page avec deux champs liste, avec source de données en formule Python, genre [{"id":"1","text":"un"},{"id":"2","text":"deux"}]
  • une condition de sortie qui vérifie un truc, n'importe lequel
  • une condition d'entrée sur la page suivante, n'importe laquelle

Quand on va cliquer sur "suivant" sur la première page, ça prend autour de 5 secondes. Si on passe sur des listes classiques sans source de donnée, on tombe sur moins d'une seconde.

Ma perception, la lenteur viendrait du (re)calcul des sources de données puis des conditions de page, nécessitant le calcul des variables de substitution ; peut-être plusieurs fois (?).

En dehors de l'arrivée des calculs "lazy" qui améliorera sans doute l'affaire, regarder si le calcul des variables de substitution est fait plusieurs fois, s'il est caché et/ou cachable, etc. ie chercher ce qu'on peut optimiser.

(à noter que les sources de données Python comme celle indiquée ci-dessus sont utilisées parce qu'on a pas (encore) la possibilité de poser des id dans les listes cf #7467)


Fichiers

Historique

#1

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

  • Description mis à jour (diff)
#2

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

  • Priorité changé de Normal à Bas

Analyse à faire mais pour moi il est plus important de permettre de créer ce genre de simples listes depuis w.c.s. (j'ai changé la mention de ticket, pour en pointer un ouvert) et d'utiliser du django lazy.

#3

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

Analyse à faire

Et il serait donc pas mal d'avoir une URL, ou un export du formulaire en question, les sources de données, etc. (parce que cinq secondes, c'est beaucoup de calculs).

#4

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

  • Statut changé de Nouveau à Information nécessaire
#5

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

  • Assigné à mis à Brice Mallet

Brice, si tu l'as dans un coin, je sais même plus où c'était...

#6

Mis à jour par Emmanuel Cazenave il y a plus de 5 ans

https://demarches-rouen.test.entrouvert.org/10-premiers-formulaires/carte-d-acces-en-vehicule-cimetiere-copie-de-emmanuel/

Pas 5 secondes mais quand même une "lenteur" tout à fait perceptible par rapport au même formulaire sans source de données pour les champs 'cimetière concerné' et 'votre demande est elle' :

https://demarches-rouen.test.entrouvert.org/10-premiers-formulaires/carte-d-acces-en-vehicule-cimetiere-copie-de-thomas/

#7

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

En voici une copie ici, mais déjà le formulaire avait été modifié. (et même pas sûr, l'URL ne correspondait pas).

Les sources de données associées :
  • cimetieres-emmanuel : [(1, 'un'), (2, 'deux')]
  • type-demande-cimetiere-emmanuel : [(0, 'nouveau'), (1, 'renouvellement')]
#8

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

"analyse" autour de :

def test_perfs_data_source_conditions(pub):
    FormDef.wipe()
    formdef = FormDef()
    formdef.name = 'Foo'
    formdef.fields = [
        fields.PageField(id='0', label='1nd page', type='page',
            post_conditions=[
                {'condition': {'type': 'python', 'value': 'form_var_bar and not is_in_backoffice'}},
            ]),
        fields.ItemField(type='item', id='1', label='Bar', varname='bar',
            data_source={'type': 'foobar'}
            #data_source={'type': 'formula', 'value': repr( [(1, 'un'), (2, 'deux')])}
            #items=['un', 'deux'],
            ),
        fields.PageField(id='2', label='2nd page', type='page',
            condition={'type': 'python', 'value': 'form_var_bar and not is_in_backoffice'}),
    ]
    formdef.store()

    NamedDataSource.wipe()
    data_source = NamedDataSource(name='foobar')
    data_source.data_source = {'type': 'formula', 'value': repr( [(1, 'un'), (2, 'deux')])}
    data_source.store()

    app = get_app(pub)
    resp = app.get('/foo/')
    t0 = time.time()
    resp = resp.form.submit('submit')
    t = time.time() - t0

    for i in range(10):
        formdef.fields.append(fields.FileField(id='%s' % (5+i), label='file%s' % i))
    formdef.store()

    app = get_app(pub)
    resp = app.get('/foo/')
    t0 = time.time()
    resp = resp.form.submit('submit')
    t_larger_form = time.time() - t0

    print t_larger_form, t

(best of three)

  • formulaire avec moins de champs,
    • éléments de liste directs : 0.056
    • éléments de liste via data source : 0.064
    • éléments de liste via python direct : 0.057
  • formulaire avec plus de champs (dix champs fichiers en plus),
    • éléments de liste directs : 0.146
    • éléments de liste via data source : 0.151
    • éléments de liste via python direct : 0.151

Bref, selon le type pour les options, il n'y a pas de différence notable (je ne mets pas tous les résultats, mais il y a une grande variation dans les résultats, une autre exécution et l'ordre aurait été différent)

Mais il y a augmentation du temps de traitement selon la taille du formulaire.

Rien d'approchant cinq secondes quand même.

Je laisse le soin de partir de ça, ou pas, pour réaliser davantage de mesures.

#9

Mis à jour par Frédéric Péters il y a 10 mois

  • Statut changé de Information nécessaire à Fermé
  • Planning mis à Non

Pas plus d'infos et si c'était lié à Python c'est obsolète.

Formats disponibles : Atom PDF