IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

Problème de performance ou tout simplement de méthodologie ?


Sujet :

Silverlight

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut Problème de performance ou tout simplement de méthodologie ?
    Bonjour à tous !
    ** Présentation du problème **
    Pour mon premier projet Silverlight, on m'a confié la réalisation d'un planning hebdomadaire. Je ne peux pas entrer dans les détails pour raison de confidentialité mais en gros j'ai une liste de personne et je dois afficher leur activité pour chaque jour de la semaine.
    Sauf que mon souci se pose au niveau de l'affichage de chaque page. Ayant 400 personnes, j'en affiche que 20 à la fois, seulement là encore chaque chargement de page prend 4 secondes à s'afficher. En gros j'ai 2secondes de récupération des données et son traitement et 2 secondes de plus pour le Bind des éléments.
    Et c'est bien cela mon problème ! 4 secondes pour 20 personnes, c'est trop long.

    ** Présentation technique **
    Imaginez un tableau où chaque ligne correspond à 1 semaine d'une personne
    Chaque ligne liste tous les jours d'une semaine
    Chaque jour contient la liste des actions à effectuer dans la journée.
    En tout je dois avoir au total des personnes 200 actions par page.
    J'ai donc choisi une arborescence de 3 listbox, d'autant plus que je dois gérer un drag and drop d'une liste à une autre, dont l'utilisation est elle aussi très ralentie en fonction du nombre de données.
    Mes données sont accessibles au travers d'un WCF distant.
    Evidemment lorsque je filtre sur une seule personne l'affichage est quasi instantané.

    Ma question est donc, est-ce que mon souci de performance vient de mon choix d'arborescence ou est-ce que je ne pourrai pas faire mieux avec Silverlight ?

    Merci de m'avoir lu et de vos remarques/idées à venir.

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Avec Windows.Forms, on peut faire SuspendLayout() sur la plupart des objets avant qu'on les modifie.

    Avec WPF, j'imagine que c'est présent aussi, d'une manière ou d'une autre.
    => Ceci évite que le système redessine le contrôle à chaque modification, et ainsi prenne un temps pas possible à le modifier.

    Idem, si tu as des évents sur ton listbox, ne les déclare que lorsque la liste est remplie, ça t'évitera de déclencher des centaines de fois des événements pour rien.

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Tu as des problèmes coté client (binding Silverlight) et coté serveur (chargement des données). Il va falloir les traiter séparément.

    2 secondes pour récupérer les données de 20 personnes c'est déjà beaucoup. Qu'est-ce que tu utilises pour ça ? OData ? REST ? WCF ? Data Services ? Quelle est la source de données ? Une base SQL à laquelle tu accèdes directement ?
    Ne récupères-tu pas plus de données que nécessaire ?

    En fonction de ce que tu utilises il y a plusieurs optimisations possibles. Coté base, procédures stokées, index, etc. Coté service, le code en lui même, le binding WCF (compression binaire), etc.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  4. #4
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    @Stringbuilder : à priori il n'existe pas de suspendLayout ou équivalent pour silverlight.

    @The_Badger_man :
    - En ce qui concerne le requêtage, problème réglé, je reçois les données quasiment en instantané. J'ai retiré des informations que je récupèrerai plus tard. Autrement j'utilise un service WCF.

    - Il me reste donc ce problème de bind.
    Un bout de code peut-être ? Voici ma page XAML
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <ListBox x:Name="lstInterv" HorizontalAlignment="Left" BorderThickness="0" Padding="0,0,0,0" VerticalAlignment="Center" Margin="50,20,0,0" Background="#36617584" MaxHeight="700" ScrollViewer.VerticalScrollBarVisibility="Auto">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Margin="0,-3,-3,0" x:Name="SPInterv">
                                    <ContentControl DataContext="{Binding intervenant}" Visibility="Collapsed" />
                                    <Border BorderThickness="0,1,1,2" BorderBrush="#FF617584" Padding="0" Margin="0,0,0,0">
                                        <TextBlock Text="{Binding intervenant.codeIntervenant}" TextAlignment="Center" VerticalAlignment="Center" Width="50" TextWrapping="Wrap"/>
                                    </Border>
                                    <Border BorderThickness="0,1,1,2" BorderBrush="#FF617584" Padding="0" Margin="0,0,0,0">
                                        <TextBlock Text="{Binding intervenant.strInterv}" TextAlignment="Center" VerticalAlignment="Center" Width="150" TextWrapping="Wrap"/>
                                    </Border>
                                    <ListBox x:Name="lstJInter" HorizontalAlignment="Center" d:LayoutOverrides="HorizontalAlignment" BorderThickness="0" Padding="0" ItemsSource="{Binding lstJourInter}" BorderBrush="Black">
                                        <ListBox.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <StackPanel Orientation="Horizontal"/>
                                            </ItemsPanelTemplate>
                                        </ListBox.ItemsPanel>
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <Border BorderThickness="0,1,1,2" BorderBrush="#FF617584" Padding="0" Margin="-3,-3,-3,-3" Width="165">
                                                    <StackPanel AllowDrop="True" x:Name="SPJInter">
                                                        <ContentControl DataContext="{Binding jour}" Visibility="Collapsed" />
                                                        <myDDL:FixedListBoxDragDropTarget AllowDrop="True" Drop="ListBoxDragDropTarget_Drop">
                                                            <!-- Cette classe supprime le bug du drag'n drop du toolkit d'origine -->
                                                            <ListBox x:Name="lstInter" BorderThickness="0" Padding="0" ItemsSource="{Binding lstInter}" Height="50" Width="160" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Auto" MouseLeftButtonUp="lstInter_MouseLeftButtonUp" MouseRightButtonDown="lstInter_MouseRightButtonDown" MouseRightButtonUp="lstInter_MouseRightButtonUp"  Background="{Binding backGround}" MouseLeftButtonDown="lstInter_MouseLeftButtonDown">
                                                                <ListBox.ItemTemplate>
                                                                    <DataTemplate>
                                                                        <Border CornerRadius="3" Height="15" BorderThickness="2" BorderBrush="{Binding findInterBorderColor}" VerticalAlignment="Top" Background="{Binding findInterColor}" Width="150" Margin="-2,0,0,-5">
                                                                            <TextBlock Text="{Binding shortInfoPlanning}" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" FontSize="9" />
                                                                        </Border>
                                                                    </DataTemplate>
                                                                </ListBox.ItemTemplate>
                                                            </ListBox>
                                                        </myDDL:FixedListBoxDragDropTarget>
                                                    </StackPanel>
                                                </Border>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
    Mes données sont bind donc par le passage de ma collection d'objet en itemssource.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Bonjour a tous,

    je rejoint the_badger_man, optimisation en passant par l'analyse du besoin.

    Dans ton cas, si j'ai bien compris, grossierement tu affiches des personnes.
    J'ai vus dans ton binding un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Text="{Binding intervenant.codeIntervenant}"
    J'en conclus que tu utilises un [Include] cote serveur, et que donc tu transmet des objets imbriques. Cela sous-entend donc de transmettre des donnees inutiles (ce qui peut expliquer le 2s).

    Pourquoi ne pas creer une entitee dedie a cette affichage ?
    Elle serait compose des champs necessaire pour l'affichage, et serait construite cote serveur, ce qui limiterai au minimum les donnees transmises.
    Un petit champs ID qui correspondra a l'ID de la personne, qui sera pas affiche comme colonne, et qui permettra de traiter les demandes.

  6. #6
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Bonjour Vinchenzo,
    Effectivement je transmet des objets imbriqués car c'est mon besoin. Seulement je n'affiche que le nécessaire. Comme je l'ai dit dans mon message précédent, le temps de réception des données n'est plus un problème, maintenant je reçois tout presque en instantanée. Seulement mon bind est toujours de presque 2s et je ne comprend pas très bien.

    Le fait que dans mes objets il y ait plus de données que nécessaire, serait susceptible de nuire à mon bind ???

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Si des donnees circulent et non son pas utilises, alors elles nuisent aux performances.
    Mais en 2012 on doit parler de peut-etre 20ms.

    Sincerement je dirait que non (pour la nuisance), sauf si les objets pesent 1mo chacun (genre photo dans les properties).

    La listBox recoit 20 entites ?
    Cette info est controle comment ?

  8. #8
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Bon j'ai suivi vos conseils et j'ai créé un objet spécial ne contenant que le minimum des informations nécessaires au traitement. Mais le temps de bind reste inchangé.

    @Vinchenzo : La listbox reçoit effectivement 20 objets, contenant chacun une string + une liste de 7 objets (pour les jour), contenant à leur tour un nombre indéterminé (mais en moyenne 3 à 6) objets représentant les activités qui contiennent des string et objets.

    Pour le nouveau test j'ai donc mis en place une liste de 2 0objets contenant une string + une liste de 7 objets (toujours pour les jours) contenant à leur contenant à leur tour un nombre indéterminé (mais en moyenne 3 à 6) objets ne contenant que 3 string.
    Mais comme dit plus haut, le temps de bind n'a pas évolué.


    Je ne comprend pas très bien ta question sur le controle !?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Et bien est-ce ta web method qui retournes 20 enregistrement ou est-ce une requete cote client ?

    Question bete : aucun appel au web service durant le chargement ? Le delai ne correspond pas a un appel asynchrone ? (comme recuperer un objet suite a la selection d'un item de la listbox).

    Il n'y a pas de raison que entre le LoadedData de ton appel au web service et l'affichage dans la listbox un delai apparaisse, surtout si des simples bind recupere des donnees deja accessible.

    Le "DataLoaded" de ta listbox est accessible ? Ce serait interessant d'ajouter des marqueurs dans les methodes pour suivre le deroulement du traitement.
    Par exemple un tableau de type double, avec un ajout des durees en fonction de l'avancement.
    La duree s'obtiendrai avec un datetime tout bete, qui servira de reference. Chaque etape se traduira par un datetime.now().substract(datetimeRef).Ticks (j'ai pas la syntaxe en tete) et en les ajoutants dans le tableau, une valeur superieur aux autres temoignera d'une activite suspecte.

  10. #10
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Désolé de ne te répondre que maintenant Vinchenzo. J'ai du effectuer une partie de la livraison du projet.
    Il y a bien un appel asynchrone au moment du chargement des données, mais celles-ci me reviennent instantanément. Pour le contrôler j'ai découpé avec des timers chaque période. L'appel asynchrone + son retour avec les données est de l'ordre de moins de 1/2s mais par contre entre ce moment là où l'application ne fait plus aucun traitement (dans le code en tout cas) et l'affichage des données, j'ai 1.5 secondes.

    Je n'ai plus le temps de faire d'autres test, étant affecté à un autre projet.
    Mais dès que je reprend, je vous tiendrai au courant des avancements, s'il y en a.

    Merci de votre aide.

Discussions similaires

  1. Problème d'image (tout simplement).
    Par @po©alypse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/02/2010, 19h06
  2. Problème : ma sphère est toute trouée !
    Par julio26 dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/05/2005, 13h47
  3. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39
  4. [oracle 9i][Workbench]Problème de performance
    Par nuke_y dans le forum Oracle
    Réponses: 6
    Dernier message: 03/02/2005, 17h38
  5. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo