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 :

Comparer le temps d'exécution de 2 routines.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de toubib
    Homme Profil pro
    Médecin, developpeur
    Inscrit en
    Août 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin, developpeur
    Secteur : Santé

    Informations forums :
    Inscription : Août 2004
    Messages : 104
    Par défaut Comparer le temps d'exécution de 2 routines.
    Bonjour.
    Problème récurrent : je veux comparer la rapidité de deux routines, j'utilise Stopwatch et le code qui suit avec mes deux routines à tester. C'est pour voir si les calculs avec des Integers, des longs, des short est plus ou moins rapide (Les articles sur le web datent un peu) . Ici j'ai la comparaison d'addition d'un integer ou d' un Short.
    Code : 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
     
            Dim b As Integer
            Dim c As Integer
            Dim i As Integer
            Dim s As Short
            Dim sw As New Stopwatch
            sw.Start()
            ' Ici  routine 1
            For c = 1 To 30000
                i = 1
                For b = 0 To 250
                    i = i + 1
                Next
            Next
            sw.Stop()
            Label1.Text = sw.ElapsedTicks.ToString()
            Dim sw1 = New Stopwatch
            sw1.Start()
            ' Ici  routine 2
            For c = 1 To 30000
                s = 1
                For b = 0 To 250
                    s = s + 1
                Next
            Next
            sw1.Stop()
            Label2.Text = sw1.ElapsedTicks.ToString()
    Le résultat est n'importe quoi!!
    Même si les 2 routines sont identiques et utilisent par exemple toutes les 2 des integers. La première routine est systématiquement plus longue.
    J'ai pris soin d'être en mode Release, de faire tourner le code plusieurs fois (la première fois cela 'devrait être plus longue' puisqu'il y a compilation JIT.
    J'ai bien compris la cause de cela, mais comment y remédier?
    Il est dit sur un forum de mesurer les processus, comment?
    Je voulais aussi utiliser un thread avec une priorité importante mais je ne sais pas récupérer les temps à la fin de la routine.
    Y a t-il un moyen sur de mesurer? Le Framework fournit il d'autres méthodes?
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Je pense que tu devrais te tourner vers les "Performance Counters". Ce n'est pas forcément simple à utiliser au début, mais tu peux mesurer pas mal de choses avec.

    Voici une introduction, et une autre.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Par défaut
    peut être tu ferais mieux d'utiliser


    au lieu


  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    avec ellapsed ms j'ai peu de variation en général (hormis le 1er tour)
    après le type de variable ne fera pas gagner des masses je pense, sinon tu peux te tourner vers du c si tu veux gagner des nanosecondes ^^

    si le temps total est moins de 50ms c'est moins fiable aussi je pense, il faut des durée assez longues et donc augmenter la boucle si nécessaire (mais tu ne précises pas les temps ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,
    Citation Envoyé par toubib Voir le message
    Bonjour.
    Problème récurrent : je veux comparer la rapidité de deux routines, j'utilise Stopwatch et le code qui suit avec mes deux routines à tester. C'est pour voir si les calculs avec des Integers, des longs, des short est plus ou moins rapide (Les articles sur le web datent un peu)
    Effectivement, les conseils microsoft sont de la version 2005.
    Le type de données Integer offre des performances optimales sur un processeur de 32 bits. Les autres types intégraux sont plus lents à charger et à stocker à partir de et dans la mémoire.
    Difficile de savoir si cela est toujours d'actualité.
    Si les "Integer" sont plus performant sur les système 32 bits, on pourrait présumer que les "Long" sont plus performant sur les système 64 bits.
    Question d'adressage en fait.
    Mais cela reste à vérifier.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Membre confirmé
    Avatar de toubib
    Homme Profil pro
    Médecin, developpeur
    Inscrit en
    Août 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin, developpeur
    Secteur : Santé

    Informations forums :
    Inscription : Août 2004
    Messages : 104
    Par défaut
    Après de multiples essais:

    Effectivement si la boucle fait 30 à 40 millisecondes les résultats sont aberrants, si j'augmente la première boucle d'un facteur 100, les temps atteignent 3000 à 4000 ms et là les résultats deviennent plus cohérents:
    La différence entre 2 routines identiques est très minime (quoique jamais égale c'est normal car Stopwath a un certains degré d’incertitude).

    J'ai testé les additions (ordinateur 64bits) en jouant sur le facteur:
    Unité centrale cible (propriété du projet, onglet Compiler)

    Pour les Integer et les Long
    AnyCPU préférer 32 bis coché : 3870 et 4040ms
    AnyCPU, préférer 32 bits non coché: 6967 et 6940 ms
    x86 :3870 et 4040ms
    x64 :6967 et 6940 ms
    Donc en 32bits les Integers sont très légèrement plus rapides.
    en 64 bits les longs sont très légèrement plus rapides que les integers mais curieusement les routines sont plus longues globalement.

    Pour les virgules flottantes:
    x86 : Single 52030, Double 5208ms
    x64 : Single 6500, Double 6400ms

    Bien sur les Decimals sont dix fois plus long que les Integers.

    Je remet le code:
    Code : 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
     Dim b As Integer
            Dim c As Integer
            Dim i As Integer
            Dim s As Long
            Dim sw As New Stopwatch
            Label1.Text = ""
            Label2.Text = ""
            sw.Start()
            ' Ici  routine 1
            For c = 1 To 3000000
                i = 1
                For b = 0 To 250
                    i = i + 1
                Next
            Next
            sw.Stop()
            Label1.Text = sw.ElapsedMilliseconds.ToString()
            Dim sw1 = New Stopwatch
     
            sw1.Start()
            ' Ici  routine 2
            For c = 1 To 3000000
                s = 1
                For b = 0 To 250
                    s = s + 1
                Next
            Next
            sw1.Stop()
            Label2.Text = sw1.ElapsedMilliseconds.ToString()
    Bien sur les différences sont minimes. Mais les calculs en 64 bits semblent plus lents.
    Commentaires ?

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    Citation Envoyé par toubib Voir le message
    en 64 bits les longs sont très légèrement plus rapides que les integers mais curieusement les routines sont plus longues globalement.
    microsoft confirme, je crois que c'était concernant vs2012 "nous n'avons pas fait de version x64 car c'est plus lent"
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VBA Comparer des temps d'exécutions très courts
    Par pgz dans le forum Contribuez
    Réponses: 5
    Dernier message: 10/12/2008, 13h28
  2. [C#] Calcul du temps d'exécution.
    Par lozzko dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/06/2005, 16h12
  3. Réponses: 2
    Dernier message: 25/05/2004, 15h33
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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