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

Langage PHP Discussion :

[Système] Différence entre ! et FALSE


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut [Système] Différence entre ! et FALSE
    Bonjour,

    Tout est dans le titre.

    Existe-t-il une différence au niveau de la priorité, des performances ou autre entre ces deux opérateurs ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!isset($var))
    
    ou
    
    if (isset($var) == FALSE)
    Merci.

  2. #2
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 54
    Points
    54
    Par défaut
    AUCUNE ta condition reste la même

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Salut,

    Ici oui, mais ce n'est pas toujours vrai car NULL et 0 sont égaux à FALSE.

    Avec cette question je souhaite m'attarder sur les performances (la logique algorithmique nous la connaissons).

    Voici une remarque intéressante que j'ai eu :

    Citation Envoyé par FloBaoti
    Sans vouloir dire de bétises, le point d'exclamation remplace le mot clé "not".
    Ce qui fait revient à un test:
    non expression == vraie
    au lieu de:
    expression == fausse

    A priori, il faudrait préférer la deuxième possibilité. J'ai l'impression que ça fait une opération en moins (prendre le contraire de l'expression).
    Merci.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    D'un point de vue algorithmique, je suis persuadé que c'est identique, les compilateurs / interpréteurs étant à mon avis suffisamment smart pour modifier l'enchainement "Not - Jump If Equal" en "Jump if not equal".

    Quand bien même, le Not est une opération tellement rapide que je doute que tu puisses mesurer une différence (autre que théorique)

  5. #5
    Membre actif Avatar de bigltnt
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Points : 205
    Points
    205
    Par défaut
    Alors pour répondre dorian53, effectivement il existe une différence, même si ca n'est pas flagrant;

    Le ! exprime effectivement le NOT, c'est a dire la négation et par delà l'inverse d'un de ce qui suit. Ainsi !(TRUE)=FALSE

    Juste pour l'historique, ou pourun complément d'information, on appelle cela des "tables logiques", et sont très utilisées en éléctronique (quoi d'étonnant, l'ordinateur n'est qu'un gros circuit ^^). Dans ces fameuses "tables logiques" tu pourras retrouver également les fonction AND (&&), OR(||), et d'autres comme le XOR, NOR, NAND, etc ...

    Je vais pas trop détailler puisqu'en plus ca n'est pas la question.

    Citation Envoyé par dorian53
    FloBaoti a écrit :
    Sans vouloir dire de bétises, le point d'exclamation remplace le mot clé "not".
    Ce qui fait revient à un test:
    non expression == vraie
    au lieu de:
    expression == fausse

    A priori, il faudrait préférer la deuxième possibilité. J'ai l'impression que ça fait une opération en moins (prendre le contraire de l'expression).
    Et bien en fait ca m'a intrigué et j'ai fais le test que tu peux refaire chez toi:
    Code : 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
    <?php
    $debut1 = microtime();
    if (!isset($var))
    {
    }
    $fin1 = microtime();
    $result1 = $fin1-$debut1;
    echo 'Premier: '.$result1.'<br/>';
     
    $debut2 = microtime();
    if (isset($var) == FALSE)
    {
    }
    $fin2 = microtime();
    $result2 = $fin2-$debut2;
    echo 'Deuxieme: '.$result2.'<br/>';
    if($result1<$result2){
    	echo '1er';
    }
    elseif($result1>$result2){
    	echo '2eme';
    }
    else{
    	echo 'egalité';
    }
    ?>
    En le lancant plusieurs fois et en comparant les 2 resultats, on voit que la deuxieme solution est quand meme la plus rapide en execution.

    Voila voila

    Quelques résultats du script de test:
    Premier: 1.6000000000016E-005
    Deuxieme: 8.000000000008E-006
    2eme

    Premier: 1.6000000000016E-005
    Deuxieme: 9.0000000000368E-006
    2eme

    Premier: 1.4999999999987E-005
    Deuxieme: 7.9999999999525E-006
    2eme

  6. #6
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Au risque de dire une connerie, ton test se base sur un appel (trois fois ok mais un test a chaque fois) alors que ce qui prend le plus de temps dans tout ca c'est surement l'appel à microtime()

    je l'ai fait avec deux boucles qui tournent 1 million de fois et les temps oscillent entre 0.5 et 1.5 secondes pour réaliser 1 million de comparaison. Le !isset() est donc parfois plus lent que isset()==false et parfois plus rapide ce qui rejoint ce que disait Cold Hand.

    Au niveau code exécuté sur la machine je pense vraiment que le code assembleur derrière est exactement le meme dans les deux cas.

  7. #7
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par koopajah
    Au niveau code exécuté sur la machine je pense vraiment que le code assembleur derrière est exactement le meme dans les deux cas.
    Vérification faite en C#, je confirme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if(!myBoolean==false){
      // Code assembleur du test
      // 0000000e  test        esi,esi 
      // 00000010  jne         00000012 
    }
     
    if(myBoolean==false){
      // Code assembleur du test
      // 00000012  test        esi,esi 
      // 00000014  jne         00000016 
    }
    Donc, c'est identique

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/01/2011, 18h26
  2. différence entre systèmes
    Par acacia dans le forum ALM
    Réponses: 2
    Dernier message: 05/03/2009, 19h52
  3. différence entre deux systèmes
    Par cmoibal dans le forum C
    Réponses: 2
    Dernier message: 15/01/2008, 14h49
  4. Réponses: 1
    Dernier message: 13/05/2007, 11h43
  5. Différence entre la programmation système ou micro
    Par Andrejimmy dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 05/10/2006, 16h21

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