Lequel de ces éléments est le plus efficace dans ColdFusion?ColdFusion: structKeyExists() plus efficace au lieu de isDefined()
isDefined('url.myvar')
ou
structKeyExists(url, 'myvar')
Lequel de ces éléments est le plus efficace dans ColdFusion?ColdFusion: structKeyExists() plus efficace au lieu de isDefined()
isDefined('url.myvar')
ou
structKeyExists(url, 'myvar')
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)
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.
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. 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
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. –
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
Très bien! Il est intéressant de voir comment il traite les fonctions différemment. –
Je pense aussi que ColdFusion doit exécuter un eval sur la chaîne que vous fournissez. StructKeyExists évite beaucoup de travail. –
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