Project

General

Profile

Development #26139

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

Added by Thomas Noël 11 months ago. Updated 11 months ago.

Status:
Information nécessaire
Priority:
Bas
Assignee:
Target version:
-
Start date:
05 Sep 2018
Due date:
% Done:

0%

Patch proposed:
No
Planning:
No

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)

carte-d-acces-en-vehicule-cimetiere-copie-de-emmanuel.wcs (6.93 KB) Frédéric Péters, 06 Sep 2018 10:16 AM

History

#1 Updated by Frédéric Péters 11 months ago

  • Description updated (diff)

#2 Updated by Frédéric Péters 11 months ago

  • Priority changed from Normal to 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 Updated by Frédéric Péters 11 months ago

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 Updated by Frédéric Péters 11 months ago

  • Status changed from Nouveau to Information nécessaire

#5 Updated by Thomas Noël 11 months ago

  • Assignee set to Brice Mallet

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

#6 Updated by Emmanuel Cazenave 11 months ago

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 Updated by Frédéric Péters 11 months ago

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 Updated by Frédéric Péters 11 months ago

"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.

Also available in: Atom PDF