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

VB.NET Discussion :

Performances en VB.NET


Sujet :

VB.NET

  1. #21
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Peut être en effet pour String.empty....

    Mais faire ceci:

    Va en fait, créer un String de valeur "", appeler la fonction String.compare et va comparer les 2 chaines de caractères...

    Tandis que Lenght = 0, va juste comparer un entier avec un autre.

    Ou je me trompe ?
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  2. #22
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 932
    Points : 1 267
    Points
    1 267
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Le message très important qu'il a cherché à te faire passer c'est qu'on n'optimise pas une application en saupoudrant quelques astuces un peu partout. On l'optimise en identifiant d'abord très précisément les parties qui sont lentes et quelles opérations sont en cause. Une fois que c'est fait tu t'attaques à ce point précis.
    Je précise, une nouvelle fois, que je me suis lancé dans ce projet de benchmark car je bosse sur trois appli qui ont des procédures très gourmandes en calcul nécessitant d'êtres optimisées

    Citation Envoyé par DonQuiche Voir le message
    Du coup il serait peut-être davantage bénéfique pour toi d'examiner les sources de la bibliothèque dotnet ou d'approfondir tes connaissances sur la façon dont ces langages sont exécutés par le processeur.
    Je passe déjà pas mal de temps à lire les pages d’aides de .NET en français et en anglais… et rien ne remplace un test pratique :-P

    Citation Envoyé par DonQuiche Voir le message
    Au passage choisir entre multiplication et division est rarement significatif. Dans des programmes réels cela peut même ne faire aucune différence.
    Je ne suis pas d’accord, j’ai constaté une amélioration dans un de mes programmes en modifiant mon algorithme pour remplacer des divisions par des multiplications. Là aussi, tout dépend de l’application. Je me suis rendu compte aussi que le compilateur devait optimiser les divisions par une constante ou les divisions de plusieurs valeurs par une même valeur en les remplaçant en interne par des multiplications.

    Citation Envoyé par DonQuiche Voir le message
    Une part essentielle de l'optimisation consiste donc à organiser tes données en mémoire de telle façon que tout tienne en cache et que les accès soient séquentiels. Pour cela tu peux remplacer tes classes par des structures dans un tableau
    J’avais essayé de le faire (remplacer une liste avec des classes par un tableau) pour un calcul de type « recherche du plus court chemin avec algorithme génétique » mais les performances se sont dégradées. J’ai essayé pendant des jours de comprendre pourquoi, essayé avec un tableau de tableaux au lieu de tableaux à plusieurs dimensions, essayé avec un tableau à une dimensions avec un offset, essayé de supprimer les contrôles de dépassement, ect… mais sans succès :-(

    Citation Envoyé par DonQuiche Voir le message
    La parallélisation. Aujourd'hui les CPU ont six à huit coeurs, demain ce seront douze à seize, puis encore davantage. Se pencher sur des micro-optimisations tout en n'utilisant qu'un seul thread serait absurde.
    Je suis d’accord mais c’est plus facile à dire qu’à faire… dans mon code, les calculs doivent être fait les uns à la suite des autres ; je ne peux pas attaquer l’étape suivante sans avoir terminé la précédente. Si j’avais un groupe de données indépendantes à traiter je pourrais les faire en parallèle mais ce n’est pas le cas.

    Autre problème avec cette méthode : il ne faut pas utiliser le traitement parallèle si chaque thread écrit un fichier sur le disque, le disque dur patine en faisant les allers-retours entre chaque fichier et bonjour la fragmentation :-P Un programme de compression vidéo (Format Factory) me propose de faire du traitement parallèle mais c’est plus lent à cause de ce phénomène.

    Citation Envoyé par DonQuiche Voir le message
    Par contre as-tu pensé à faire un "tour de chauffe" (warm-up) ? C'est à dire à exécuter une première fois le code avant de lancer le benhcmark, pour être sûr que le JIT a déjà compilé cette méthode ?
    Oui, comme je l’ai dit mon programme se présente sous forme d’une fenêtre avec un bouton pour chaque test. Je peux donc lancer plusieurs tests les uns après les autres pour « chauffer » le programme et au final ne retenir que le résultat du dernier test

    Citation Envoyé par Pol63 Voir le message
    quand on teste l'existence de 2 chaines il devrait déjà vérifier si la longueur est la même
    Je me suis fait la même réflexion :-)

    Citation Envoyé par mactwist69 Voir le message
    Je dis peut être une bêtise mais je crois que le = "" est plus long car il va d'abord créer une objet string, pour y stocker une chaîne vide...

    Tandis que le Lenght=0 il ne fait qu'un comparaison.
    En fait je pense qu’utiliser If s.Length <> 0 est le plus rapide car une chaîne de caractère semble être une classe en VB.NET, et .Length est une propriété de la classe, actualisée à chaque modification de la chaîne. Donc utiliser s.Length c’est juste lire une propriété de la classe ?
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  3. #23
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Utiliser String.Empty fait appel à l'instruction IL Ldsfld (Load static field) et utiliser "" fait appel à Ldstr (Load string) qui assure que :
    L'infrastructure CLI garantit que deux instructions ldstr qui font référence à deux jetons de métadonnées ayant la même séquence de caractères retournent précisément le même objet chaîne (processus connu sous le nom d'internement de chaîne).
    Moralité s'il y a interning String.Empty ou "" ça revient au même, sinon il y aura un "surcoût"* à la 1ère utilisation de "" uniquement. (* et encore là aussi entre ce que peut faire en plus le compilo, le JIT ou un NGEN agressif rien ne garanti qu'il y ait vraiment un surcoût au final)

    Quant à savoir ce qui est "le mieux" pour vérifier une chaine vide c'est typiquement le genre d'optimisation inutile et il est normal que le test d'égalité (= ou <>) soit plus long qu'un test de comparaison de longueur ; perso je connais pas toutes les spécificités de toutes les cultures mais rien ne dit que l'une d'entre elles ne possèdent pas un équivalent de chaine vide qui ne soit pas de longueur 0 (je renvoie à mon exemple sur la culture allemande plus tôt même si là il ne s'agissait pas de chaines vides).
    Donc d'un côté on compare 2 nombres (avec juste un accès à une propriété et de l'autre il y appel de méthode qui commence par vérifier l'égalité des références puis vérifie si l'un ou l'autre est Nothing (auquel cas on vérifie si la longueur de l'autre vaut 0 pour renvoyer 0 sinon on renvoie 1 ou -1 selon lequel des 2 était Nothing) si rien de ça n'a marché on compare "ordinalement" ou on compare avec les informations de comparaison de la culture actuelle selon les options de compilation du projet ET les options du fichier qui pourraient s'intercaler en contradiction avec celles du projet).

    Alors oui on peut dire que en moyenne c'est 7 fois plus lent ; mais on peut aussi dire qu'on gagne juste 3 nanosecondes autrement dit rien !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  4. #24
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Alors oui on peut dire que en moyenne c'est 7 fois plus lent ; mais on peut aussi dire qu'on gagne juste 3 nanosecondes autrement dit rien !
    Je ne m'étais point étendu sur la pertinence.... Juste sur l'explication.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #25
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    C'était une remarque sur la discussion plus que sur le post

    Sinon, pour le "fun", je me suis amusé à refaire une partie des tests mentionnés ; par contre le code n'est pas du plus propre (beaucoup de duplication pour être sûr de ne mesurer que l'essentiel sans trop de paramétrisation)
    Je joins le code tel quel (il nécessite VS2015 et la v4.6 du framework) ainsi que le fichier obtenu par son exécution (dans bin\Release\benchmark.txt) :
    Benchmark.zip
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

Discussions similaires

  1. Problème de performance site ASp.Net
    Par LEK dans le forum Développement Web avec .NET
    Réponses: 5
    Dernier message: 23/03/2010, 20h46
  2. Réponses: 1
    Dernier message: 05/02/2008, 16h35
  3. Performance et ASP.NET / comparaison java ?
    Par tefirette dans le forum ASP.NET
    Réponses: 3
    Dernier message: 24/09/2007, 14h31
  4. [VB .Net] Performance sur parcours de hashtable
    Par plasticgoat dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/12/2005, 20h25
  5. [VB.NET] With...End With et performances ?
    Par Dnx dans le forum Windows Forms
    Réponses: 9
    Dernier message: 06/04/2005, 13h37

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