web-dev-qa-db-fra.com

Les conditionnels imbriqués ont-ils un impact significatif sur la performance?

C'est une question qui vit dans mon esprit depuis longtemps.

L'utilisation de plusieurs déclarations conditionnelles imbriquées a-t-elle une incidence sur la performance d'un code pris? Jusqu'à présent, je sais que les programmeurs ont créé un terme précis pour décrire cette situation, la "pyramide de Doom" célèbre [[Wikipedia page] , mais un côté de celui-ci Combien peut-il dégrader des performances?

Prenons cette situation comme exemple: j'ai un JSON provenant d'une réponse de serveur contenant quelques objets représentant les achats de l'utilisateur dans une application, avant de prendre les données nécessaires, je dois vérifier diverses conditions:

  1. Est la réponse que nous recherchons?
  2. La réponse a-t-elle resultCode: OK?
  3. Les contenus sont-ils à traiter?

À ce stade, si tout est true un "processus de traitement" commencera, analyser et éditer la réponse du serveur, dans ce cas pour changer le format de date de notre part au format européen standard. Le processus consiste en deux nichés for-loops et un if statement.

Ceci est l'exemple de code dans Objective-C, depuis que je suis un développeur iOS:

if ([remoteManager.operationId isEqualToString:NEEDED_OPERATION_ID]) {
    if ([response[RESULT_CODE_KEY] isEqualToString:@"OK"]) {
        if ([response[RESULT_OBJ_KEY][@"CONTENT_LIST"] count] > 0) {
            NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];

            for (NSMutableDictionary *productsAvailable in response[RESULT_OBJ_KEY][@"CONTENT_LIST"]) {
                for (NSString *key in productsAvailable) {
                    if ([key isEqualToString:@"NEEDED_KEY"]) {
                        /* We change the date format here */
                    }
                }
            }
        }
    }
}

Dans mon opinging, ce code ne peut avoir vraiment d'impact sur la performance d'une application, car ces chèques ne sont pas si compliqués pour le système. Mais cela peut être un problème si nous devons avoir la vitesse maximale et les performances? En d'autres termes: devraient-ils être évités ou non? Et met également en place plusieurs conditions en même temps réduit les problèmes de performance (le cas échéant)?

3
Aluminum

La séquence des étapes que vous avez décrites semble être une séquence d'étapes que vous DOIT Effectuer, afin que votre demande permet de réaliser ce qu'elle est censée réaliser. Donc, il n'y a rien que vous puissiez ajouter ou supprimer.

Avec le code existant, vous avez les options suivantes:

  • Réorganiser l'ordre dans lequel les conditionnels sont évalués. Vous pouvez peut-être obtenir de meilleures performances en réorganisant les conditionnels afin que les plus fréquemment échoués soient évalués d'abord, ou de manière plus coûteuse Sont évalués en dernier, mais cela ne vaut guère d'effort et, dans tous les cas, vous devez passer du temps à mesurer des choses avant de tenter cela, sinon vous êtes fusionné du problème et que vous couriez le danger de s'aggraver les choses au lieu d'améliorer les choses.

  • Remplacer la nidification avec plusieurs expressions anded ensemble. Je ne sais rien de l'objectif-c, mais je serais prêt à parier que cela reste fidèle à la tradition de C, et utilise une évaluation de l'expression booléenne de courte-circuit, Donc, la construction if(a) { if(b) { ... } } est équivalente à if((a) && (b)) { ... }, alors nidification ou aucun nidification ne fait absolument aucune différence.

  • remplacer la nidification avec la sortie précoce. La sortie précoce est quand vous dites if(!a) return; if(!b) return; bulk-of-code-goes-here. Il y a des personnes qui insistent sur la sortie précoce, de manière à réduire la nidification, et d'autres qui ne voient aucun problème avec niché, et croire que la sortie précoce est mal. Mais encore une fois, cela ne fait aucune différence sur la rapidité avec laquelle le code fonctionnera, de sorte que ce problème est tout au sujet du style, pas de la performance: "Nid ou non à Net de nid" est une question entièrement subjective qui ne peut recevoir qu'une réponse subjective. (Ce qui est bien sûr "Die, vous imbriquez imbécile!")

Donc, il n'y a pas à peu près rien que vous puissiez faire pour améliorer les choses, et nicher ni niché de nidification n'a absolument aucun impact sur la performance. En plus de cela, peu importe la façon dont vous structurez votre conditionnement, le compilateur est généralement libre d'émettre le code de la machine de la manière dont il voit s'adapter, tant qu'il en a le même résultat, de sorte que vos contenus imbriqués seront probablement mis en œuvre au début des sorties. par le compilateur, tout comme l'évaluation de court-circuit le ferait. Cela signifie qu'à la fin de la journée, le seul critère pour organiser votre conditionnement devrait être Comment il est le plus naturel pour vous de les lire et les comprendre.

Je vous recommanderais de tenir compte des conseils énoncés dans la suggestion excellente (et ironique) de GNAT selon laquelle votre question est une duplication d'une autre question qui est en fait sur les micro-optimisations: Arrêtez de vous inquiéter de la performance du code. VOUS devrait seulement commencer à être inquiet sur la performance si votre produit final souffre de la performance-sage, et même à ce moment-là, les solutions que vous trouverez seront probablement algorithmique, optimisations de grandes images, Et il est fort peu probable qu'ils aient quelque chose à voir avec la façon dont vous commandez des instructions individuelles.

7
Mike Nakis

Le problème des conditions imbriquées n'est pas une vitesse, sa compréhension humaine.

Les êtres humains ont du mal à faire face à de nombreuses possibilités à la fois. Ils atteignent leur limite (ce qui est assez petit) puis commencer à faire des erreurs sans s'en rendre compte.

Les déclarations conditionnelles augmentent la complexité assez rapidement: 2, 4, 8, 16, 32, 64, 128 ... et pour presque tous les programmeurs, la limite est en chiffres.

Les ordinateurs n'ont aucun problème d'optimisation du code avec de très nombreuses conditions imbriquées, mais les humains trouveront presque impossible de maintenir le code source - ce qui signifie qu'il ne fonctionnera pas.

La plupart des techniques de programmation concernent la gestion de la faiblesse humaine, plutôt que de la vitesse. Le code source est destiné aux humains.

8
user147272