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

C# Discussion :

Optimisation du nombre d'instruction: Contrainte de temps


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 40
    Points
    40
    Par défaut Optimisation du nombre d'instruction: Contrainte de temps
    Bonjour,

    Je cherche à optimiser un temps d'exécution de code qui devient critique, je dois faire des tests sur une variable qui s'incrémente et faire changer l'état d'une sortie en conséquent, le code est le suivant:

    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
    30
    31
    32
    33
    34
    35
    if(Data_transmitted < 100)     //1 clock=104µs so approximately 10 ms
        {
                LATAbits.LATA2=0b1;
                a1=1;
         }
    else if(Data_transmitted == 100)// End//Start
        {
                LATAbits.LATA2=0;
        }
     
    else if(Data_transmitted == 101)// End//Start
        {
                LATAbits.LATA2=1;
        }
    else if(Data_transmitted == 118)// End//Start
        {
                LATAbits.LATA2=1;
        }
    else if(Data_transmitted == 119)
        {
                LATAbits.LATA2=0;
        }
    else if(Data_transmitted == 120)
        {
                LATAbits.LATA2=0;
        }
    else if(Data_transmitted == 121)
        {
                LATAbits.LATA2=1;
        }
    else
       {
                LATAbits.LATA2=1;
        }
    }
    Avez vous des pistes pour optimiser ce code ?

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Je n'ai pas testé, mais avec un dictionnaire (pour les valeurs > 100). Avec la valeur sur laquelle ti fais tes "if" en clé, et 1 ou 0 comme valeur de cette clé. Genre :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var dict = new Dictionary<int,int> {{100,1},{101,0}};
     
     
    var example = 101;
     
     
    int i;
     
     
    LATAbits.LATA2 = (dict.TryGetValue(example, out i)) ? i : 1; // 1 semble être la valur par défaut dans ton example
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 93
    Points : 127
    Points
    127
    Par défaut
    1) Je ne sais pas si ça un réel impact de temps mais peut-être qu'un switch à la place de tes nombreux else if pourrait se faire dépend comment à bas niveau cela est géré.
    Mais déjà cela rendrait le code plus propre à voir ^^

    2) Vu ta structure que tu présentes tu peux :

    If( < 100) LATAbits.LATA2 = 0b1;
    Else if(Data == 100 || == 118 || ==119) LATAbits.LATA2 = 0;
    Else LATAbits.LATA2 = 1;

    3) Ou t'arranger pour faire en sorte que le = 0 soit sur les data paires et = 1 quand elles sont impaires comme ça tu pourrais faire un truc comme ça

    If( < 100) LATAbits.LATA2 = 0b1;
    Else LATAbits.LATA2 = Data % 2;

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Je suis un peu perplexe sur le fait que ce bout de code puisse mettre plus de... allez, 4 cycles CPU ?

    Il n'y aura rien de plus rapide qu'un if / else if / else.

    Un switch reviendra, d'un point de vue performances (et code machine) rigoureusement au même.

    Une recherche dans un dictionnaire se traduira forcément par une itération, ce qui sera infiniment plus lent (non pas que ce soit lent, mais que 100 cycles CPU est "infiniment" plus lent que 4 cycles...)

    Avez-vous benchmarké ce bout de code ?

    Est-ce que Data_transmitted est un type simple (int) ? Ou bien est-ce que ça cache du monde ? Genre une propriété avec un GET extrêmement coûteux (genre un .Count sur un List<T>) ?

    Car là, autant on peut redire sur la lisibilité d'un if à rallonge, autant on ne peut rien dire quant à ses performances.
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Sinon, j'ai pas tout pigé...

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //1 clock=104µs so approximately 10 ms

    Chez moi, 104 µs, ça fait 0,104 ms...

    Et ça rebondi bien sur ce que je dis, à mon avis, c'est pas là que ça bloque votre truc...
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    Je viens de changer le code en passant par des switch case. Cela résout le probleme. Merci pour votre aide !

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Une recherche dans un dictionnaire se traduira forcément par une itération
    le dictionnaire utilise un index par hashage, ce qui en lecture est très efficace (pas de parcours de toute la collection)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Je suis un peu perplexe sur le fait que ce bout de code puisse mettre plus de... allez, 4 cycles CPU ?
    Je suis également circonspect, je parie que le problème est mal diagnostiqué. A moins d'utiliser un CPU rudimentaire avec une prédiction de branchement limitée.

    Par contre un switch sera presque toujours plus rapide. Souvent ils sont très optimisés, avec par exemple une approche dichotomique quand c'est pertinent. Ici il y a de bonnes chances que le compilateur décide d'utiliser un switch matériel (un lookup dans un tableau), ce qui est clairement le plus rapide.

    Certes un compilateur pourrait réaliser que ces if enchaînés se prêtent aux mêmes optimisations. Mais les compilos JIT doivent s'exécuter rapidement et se fixent des objectifs limités.


    Citation Envoyé par Pol63 Voir le message
    le dictionnaire utilise un index par hashage, ce qui en lecture est très efficace (pas de parcours de toute la collection)
    La notion d'efficacité est relative. Ça reste du 20ns par accès pour un petit dico. C'est très rapide pour la majorité des besoins, néanmoins pendant cette période un coeur peut idéalement traiter 400 instructions. Nul doute qu'un dictionnaire serait ici beaucoup plus inefficace qu'un switch bien optimisé.

  9. #9
    Membre habitué Avatar de maleaume
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 93
    Points : 131
    Points
    131
    Par défaut
    Plus qu'un problème de perf sj 'y vois aussi un problème de lisibilité.
    concernant les perfs tout dépend aussi de la fréquence d'appel.
    j 'écrirais ton code de la manière suivante au vue de ce que tu as écris.
    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
     
             switch(Data_transmitted)
            {
                case 100:
                case 119:
                case 120:
                    LATAbits.LATA2=0;
     
                default:
                 LATAbits.LATA2=1;
     
            }
             if(Data_transmitted < 100)     //1 clock=104µs so approximately 10 ms
            {
                    LATAbits.LATA2=0b1;
                    a1=1;
            }

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

Discussions similaires

  1. optimiser le nombre de groupes par page
    Par rcarafray dans le forum Débuter
    Réponses: 1
    Dernier message: 18/12/2008, 18h50
  2. Limiter le nombre d'application en même temps
    Par Jean_dick15 dans le forum VB.NET
    Réponses: 6
    Dernier message: 16/01/2008, 20h26
  3. algorithme qui détecte et compte le nombre de visages et leur temps d'attention
    Par aptchagi dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/06/2007, 14h46
  4. Trigger vidant des informations selon une contrainte de temp
    Par jlassira dans le forum Développement
    Réponses: 1
    Dernier message: 16/11/2005, 15h50

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