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

Discussion :

Dilemme sur la méthode à utiliser

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 29
    Points : 12
    Points
    12
    Par défaut Dilemme sur la méthode à utiliser
    Bonjour,
    J'ai une structure, disons un tableau tab[i] qui contient N "objets" pour lesquels je dois faire deux traitements distincts :
    1) la même action, par exemple assigner un callback ;
    2) une action qui dépend d'une propriété de l'objet (par exemple assigner une couleur en fonction du nom d'une propriété).

    A priori, j'ai envie d'itérer sur le tableau et coder les deux actions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Faire l'action 1)
    Faire un switch/case à N cas pour faire l'action 2)
    Mais cela implique que les tests switch/case vont avoir lieu N fois ! (Donc 1x2x3x...xN tests si je ne me trompe pas)

    Je peux me débrouiller pour passer par une solution qui évite ce problème mais n'évite pas le "DRY" (ne pas se répéter) et qui est applicable quand N est assez petit puisqu'il consiste à répéter le traitement au cas par cas sans passer par un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Récupérer élément1 et faire 1) puis 2)
    Récupérer élément2 et faire 1) puis 2)
    ...
    Récupérer élémentN et faire 1) puis 2)
    Existe-t-il une meilleure solution ? Que choisir au final ?
    Merci pour vos suggestions.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par alt184 Voir le message
    Mais cela implique que les tests switch/case vont avoir lieu N fois ! (Donc 1x2x3x...xN tests si je ne me trompe pas)
    si j'ai bien compris, avec par exemple 5 cas dans le "switch", ça fera 5 × n tests donc il n'y a pas de souci de base.
    éventuellement, il y aura peut-être des optimisations en fonction des tests que vous faites.

  3. #3
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Les switchs sont très bien car très souvent et de manière intrinsèque, ils sont convertis en "jump table" ( https://en.wikipedia.org/wiki/Branch_table )
    Ceci fait qu'il n'y a aucune différence entre un switch de 2 cases et un switch de 1000 cases en terme de coût à l'exécution.

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 594
    Points
    188 594
    Par défaut


    Tout dépend du compilateur ! Normalement, vu qu'on travaille sur les switch depuis des décennies, le code généré doit être proche de l'optimal, mais c'est peut-être aussi la même chose pour une série de if.

    L'idéal est de vérifier exactement le code généré, par exemple avec GodBolt / Compiler Explorer : https://godbolt.org/. J'ai configuré le compilateur en C pour que le résultat soit plus lisible.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int fif(int i) {
        if (i == 0) return 5; 
        else if (i == 1) return 28;
        else if (i == 2) return 0;
        else return -1;
    }
     
    int fswitch(int i) {
        switch (i) {
            case 0: return 5;
            case 1: return 28;
            case 2: return 0;
            default: return -1;
        }
    }

    Code asm : 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
    44
    45
    46
    47
    48
    49
    50
    fif:
            push    rbp
            mov     rbp, rsp
            mov     DWORD PTR [rbp-4], edi
            cmp     DWORD PTR [rbp-4], 0
            jne     .L2
            mov     eax, 5
            jmp     .L3
    .L2:
            cmp     DWORD PTR [rbp-4], 1
            jne     .L4
            mov     eax, 28
            jmp     .L3
    .L4:
            cmp     DWORD PTR [rbp-4], 2
            jne     .L5
            mov     eax, 0
            jmp     .L3
    .L5:
            mov     eax, -1
    .L3:
            pop     rbp
            ret
    fswitch:
            push    rbp
            mov     rbp, rsp
            mov     DWORD PTR [rbp-4], edi
            cmp     DWORD PTR [rbp-4], 2
            je      .L7
            cmp     DWORD PTR [rbp-4], 2
            jg      .L8
            cmp     DWORD PTR [rbp-4], 0
            je      .L9
            cmp     DWORD PTR [rbp-4], 1
            je      .L10
            jmp     .L8
    .L9:
            mov     eax, 5
            jmp     .L11
    .L10:
            mov     eax, 28
            jmp     .L11
    .L7:
            mov     eax, 0
            jmp     .L11
    .L8:
            mov     eax, -1
    .L11:
            pop     rbp
            ret

    À première vue, pour ce petit exemple, le switch génère une série très dense de sauts conditionnels (bonne utilisation des caches, je ne pense pas que la prédiction de branchement fera des miracles), les if vont sauter assez loin (on risque vite de sortir des caches). Maintenant, c'est sur un petit exemple.

    Ça, c'est pour l'aspect if/switch. Ensuite, ce que tu proposes, c'est de dérouler la boucle à la main : ne peux-tu pas demander à ton compilateur de forcément dérouler la boucle automatiquement ? Comme ça, tu auras un code propre et le même code généré (une fois la boucle déroulée, si le code est bien écrit, le compilateur devrait pouvoir déterminer tout seul la bonne action à réaliser sans branchement). Ça n'implique pas que le code déroulé sera plus rapide…

    In fine, tant que tu ne sais pas si cette boucle prend du temps à l'exécution, écris le code le plus simple, le plus débile possible (KISS) ; si ça devient un problème, il sera toujours temps d'y réfléchir (vu que ce n'est pas un problème d'architecture globale du code, juste la manière d'écrire une fonction).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    Ça vole haut, un peu trop pour moi en fait ! Alors pour répondre dans l'ordre...

    Comme un switch/case s'arrête quand il a "matché" (si bien codé), il n'y aura pas 5x5 tests mais 1+2+3+4+5 si je ne dis pas de bêtise. Ca ne change pas grand chose pour N grand (genre N^2 contre N(N+1)/2).
    Je sais bien qu'il y a des optimisations mais je ne sais pas sur quels éléments et à quel niveau.
    En fait, ma question est plus théorique dans ce cas car je sais bien que 5 cas (en fait je n'en ai que 3 au final !) ne vont pas faire une différence entre l'une ou l'autre façon de coder (disons que pour l'utilisateur, vu qu'il n'y a qu'une instruction légère, ça ne pourra pas se voir). La question est plus d'ordre générale et "bonne pratique".

    Merci en tous les cas pour vos réponses qui me permettent d'apprendre des choses sur le sujet !

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par alt184 Voir le message
    Comme un switch/case s'arrête quand il a "matché" (si bien codé), il n'y aura pas 5x5 tests mais 1+2+3+4+5 si je ne dis pas de bêtise.
    quel langage utilisez vous ?
    si vos éléments sont tous différents, il existe des structures dans plusieurs langages qui permettent d'associer des valeurs.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    C'est du javascript, je récupère les données d'un sélecteur.

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    et ensuite, vous l'utilisez comment ? si du code html, vous pouvez définir les couleurs en css.
    montrez nous un exemple de code.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    Non c'est plus compliqué, il y a vraiment besoin de javascript.
    Et puis comme je disais plus haut, l'exemple n'est pas important, c'est la pratique générale qui m'intéresse, quel que soit le langage et le contexte .

  10. #10
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Je viens de relire ton sujet et le switch ne semble pas adapté à ton besoin, puisque tu connais à l'avance tes objets.
    Alors ce que tu peux faire c'est leurs ajouter une propriété qui serait un nom de fonction, comme ça quand tu parcours ton tableau, tu pourras faire ton action 2 directement.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    Oui mais pour parcourir le tableau, je fais une boucle qui itère sur le nombre d'éléments du tableau, donc de 0 à N-1, et alors je ne sais pas à l'avance quel sera le premier objet. Je dois donc faire un test et envisager tous les cas à chaque passage de boucle. D'où soit une série de if, soit un switch (ou toute autre structure existante dans le langage utilisé).

    (En fait, je connais l'ordre parce que c'est celui du HTML a priori, mais je ne peux pas me baser sur cette information car cela créerait une faiblesse dans le code. Et surtout, je pose une question très générale...)

  12. #12
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Pourtant dans ton premier message tu passes d'une version avec switch à une version sans.
    Sinon un tableau associatif, un dictionnaire (Map()) alors.

Discussions similaires

  1. Utilisation du Stream - Votre avis sur cette méthode
    Par Kasko dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/10/2017, 21h02
  2. Réponses: 7
    Dernier message: 27/03/2013, 14h20
  3. [Débutant] Base d'informations sur le file system, quelle méthode utiliser ?
    Par berceker united dans le forum C#
    Réponses: 0
    Dernier message: 02/07/2012, 21h43
  4. méthode à utiliser pour annuaire
    Par psyco2604 dans le forum ASP
    Réponses: 2
    Dernier message: 01/06/2004, 15h46
  5. Réponses: 3
    Dernier message: 16/04/2004, 16h51

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