2010-03-05 6 views
6

J'essaie juste d'optimiser mon code. J'ai besoin de pré-remplir un formulaire avec des données d'une base de données, et je dois vérifier si la variable existe pour remplir la zone de texte (je n'aime pas la dissimulation d'erreur @). La forme est vraiment longue, alors j'ai besoin de vérifier plusieurs fois si les variables existent.

Ce qui est plus rapide des deux suivants?

  • if (isset ($item))
  • if ($item_exists==true)

Ou encore

  • if ($item_exists===true)
+3

vous pouvez avoir des ennuis avec 'si ($ foo == true)', si foo $ est égal à zéro et est valide? –

+0

La pénalité de performance pour le cas == et === est, une erreur E_NOTICE est levée car la variable n'existe pas. Les erreurs de lancer sont relativement coûteuses. Lorsque vous appelez isset(), aucune erreur n'est levée si la variable n'existe pas. –

Répondre

7

Je suis sûr qu'il ya une différence de performance; Je suis sûr qu'il a été évalué quelque part; mais je suis également sûr que cela n'a vraiment aucune importance pour des objectifs réels. Tout gain réalisable est dans les millisecondes ici, et ce qui est beaucoup, beaucoup plus important est la lisibilité du code, et l'évitement des avertissements (qui coûtent des performances, que ce soit en sortie ou non).

Vous aurez probablement besoin isset si vous ne pouvez pas être sûr qu'il est défini au moment où vous y accédez. comparaison de type sécurité === ne devrait pas être nécessaire si $item_exists est toujours un booléen, mais il ne nuira pas non plus. Ainsi, en fonction de votre situation, vous devrez peut-être

if ((isset($item)) and ($item_exists === true)) 
+0

Merci pour votre réponse Pekka. – earlyriser

+0

Il est préférable d'utiliser 'if (empty ($ item))' à la place de ce code. – Ariel

11

Dans ce cas, vous ne devriez pas poser des questions sur la performance mais de justesse en premier. Parce que isset ne se comporte pas comme une convertion booléenne et comparaison vrai (voir type comparison table). En particulier, les valeurs "" (chaîne vide), array() (tableau vide), false, 0 et "0" (0 en tant que chaîne) sont traitées différemment.

+1

+1. En plus de la différence dans les tables de comparaison, l'utilisation d'un opérateur de comparaison sur une variable non déclarée aboutit à un E_NOTICE. –

1

Pour répondre à bien, très probablement isset() et « === » sera le plus rapide qu'ils ne vérifient que pour une seule condition, où == vérifie plusieurs conditions et être plus lente. Je n'ai pas testé cela officiellement, mais je pense que c'est juste. @Pekka est également correct, si vous cherchez à optimiser, ceux-ci ne vont vraiment pas où vous le faites. Comme il faudrait probablement des milliers d'appels juste pour remarquer quelques millisecondes de différence.

22

Avec une boucle for répétant 10000000 fois le même script a pris:

  • if (isset ($item)) 2,25843787193
  • if ($item_exists==true) 6,25483512878
  • if ($item_exists===true) 5,99481105804

Je peux donc dire isset est certainement plus rapide.

+0

+1 pour effectuer l'analyse comparative. Cela montre également que cela ne fait aucune différence - il est extrêmement rare qu'un script PHP fasse quelque chose 10 millions de fois, et habituellement, le temps système des E/S de base de données augmenterait massivement le temps nécessaire. –

+0

Qu'est-ce qui était $ item_exists? Je pense que le "==" peut varier en fonction de son type – Seaux

+2

Pour ajouter au jeu de nombres: De toute façon, c'est de l'ordre de 0.0000001 secondes. Ce qui signifie que vous devrez le faire environ 1 000 000 fois par page pour être quelque chose que l'utilisateur remarquera (en supposant que 0,1 secondes est ce que l'utilisateur remarquerait). En bref, le type de micro-optimisation qui fera rarement, voire jamais, la différence. –

-1

Il n'y a qu'une seule façon d'optimiser votre code, appelé « profilage ». D'abord, vous devez savoir quelle partie du code nécessite une optimisation. Et seulement ensuite exécuter des tests, trouver des solutions, etc.

L'approche «indirecte» de la réponse de Marcx est horrible aussi. Si vous voulez tester si un code fait une réelle différence, testez-le du point de vue du navigateur, en utilisant l'utilitaire benchmark Apache.

0

Je suggère les solutions suivantes:

if (@$item) 
if (@$item_exists) 
Questions connexes