Répondre

37

Ces jours (CF8 +) la différence de vitesse n'est pas que grand. Cependant, structKeyExists est en effet un peu plus rapide. Voici pourquoi.

Lorsque vous utilisez isDefined, la chaîne que vous transmettez est recherchée en tant que nom de clé dans plusieurs étendues. En date du CF9, la liste des champs, dans l'ordre contrôlé est: (source)

  1. locale (fonction locale, UDFs et CFC seulement)
  2. Arguments
  3. fil local (à l'intérieur des fils uniquement)
  4. requête (pas une véritable portée, applique pour les variables dans les boucles de la requête)
  5. discussion
  6. Variables
  7. CGI
  8. cffile
  9. URL
  10. Formulaire
  11. Cookie
  12. client

Même si vous utilisez le nom de champ avec isDefined (comme: if isDefined('variables.foo')) la liste sera toujours vérifiée afin; et si la variable local.variables.foo est définie, elle sera trouvée AVANTvariables.foo.

D'autre part, structKeyExists recherche uniquement la structure que vous lui transmettez pour l'existence du nom de clé; il y a donc beaucoup moins d'endroits qu'il faudra regarder. En utilisant du code plus explicite (structKeyExists), non seulement vous gagnez en performance, mais votre code est plus lisible et plus facile à maintenir, à mon avis.

+0

Très bien! Il est intéressant de voir comment il traite les fonctions différemment. –

+0

Je pense aussi que ColdFusion doit exécuter un eval sur la chaîne que vous fournissez. StructKeyExists évite beaucoup de travail. –

+1

Il y a un gros problème avec 'structKeyExists()'.Si vous désérialisez une chaîne JSON avec ColdFusion et que vous avez une propriété 'myVal' avec la valeur' null', alors 'structKeyExists (object," myVal ")' retournera 'true', alors que' isDefined ("object.myVal") 'ne le fera pas. En d'autres termes, si vous tentez d'accéder à la propriété avec object.myVal après avoir vérifié avec 'structKeyExists()', vous obtiendrez une erreur. – android

10

Utilisez celui qui est plus facile à lire et montre le mieux ce que vous faites.

La différence entre les deux est incroyablement petit, et très probablement pas la peine de s'inquiéter du tout.

Ne perdez pas de code en optimisant le temps, sauf si vous avez un prouvé et reproductible cas de test qui démontre la lenteur.

+1

+1. Il est certainement utile de comprendre * comment * les deux fonctions fonctionnent. Mais sauf si vous avez un problème de performance , l'écriture de code lisible qui se comporte correctement est bien plus important IMO. – Leigh

+0

Je suis entièrement d'accord, mais je suis toujours un utilisateur régulier de 'structKeyExists'. Je trouve que sa nature explicite rend tout limpide, où 'isDefined' ne le fait pas toujours, ce qui entraîne plus de temps et de maux de tête pour revenir à l'ancien code (et/ou le code de quelqu'un d'autre) des mois ou des années plus tard. –

+0

Bien que IsDefined() soit nommé plus intuitivement, ce que vous venez de décrire est toujours une meilleure raison de choisir l'un plutôt que l'autre, plutôt que des préoccupations prématurées au sujet des performances. Au moins à mon humble avis ;-) - Leigh 8 mins il ya – Leigh

Questions connexes