L'évaluation des courts-circuits est-elle vraiment rapide? Différence entre && et & en Java

Qu'est-ce que l'évaluation des courts-circuits?

Si vous étudiez un peu Java, vous obtiendrez quelque chose appelé "évaluation des courts-circuits". c'est&&Ou||Dans un opérateur logique tel que, lorsque le côté gauche est évalué, la valeur booléenne de l'expression entière est déterminée et s'il n'est pas nécessaire d'évaluer le côté droit, le côté droit n'est pas évalué. Consultez l'exemple suivant.

boolean flag1 = false;
boolean flag2 = false;
if(flag1 && flag2){
    System.out.println("Les deux variables sont vraies.");
}

Dans ce programme, flag1 et flag2 doivent tous deux être vrais pour que la branche conditionnelle sur la troisième ligne s'exécute à l'intérieur du bloc entre crochets du milieu. Cette fois, flag1 est faux, vous pouvez donc voir que vous n'avez pas à entrer dans le bloc de parenthèses du milieu sans avoir à vérifier la valeur booléenne de flag2. Dans une telle situation, l'évaluation de court-circuit est une fonction qui empêche l'évaluation de flag2 d'être effectuée automatiquement.

Différence entre && et &

Java a deux opérateurs similaires, && et &. Les deux opérateurs ont presque les mêmes fonctionnalités, mais avec quelques différences. Comme mentionné précédemment, l'opérateur && fonctionne comme une fonction d'évaluation de court-circuit. Cependant, l'évaluation des courts-circuits ne fonctionne pas pour &. Autrement dit, & évalue la valeur du côté droit même dans des situations où il n'est pas nécessaire d'évaluer la valeur du côté droit.

L'évaluation des courts-circuits est-elle vraiment rapide?

Les livres de référence et les sites Web Java disent que && est plus rapide car il ne fait pas d'évaluation supplémentaire. Quand j'ai lu cette description, je me demandais. "Puisqu'il s'agit d'un processus différent, est-il vraiment plus rapide de simplement passer le processus du bon côté?" J'ai donc essayé de vérifier la différence de vitesse de traitement entre && et &.

Programme de vérification

Programme pour évaluer le court-circuit

Test1


long start = System.currentTimeMillis();
boolean flag1 = false;
boolean flag2 = false;

for(long i=0; i<10000000000l; i++) {
    if(flag1 && flag2) {
        System.out.print("");
    }
}

long end = System.currentTimeMillis();
System.out.println("Temps d'exécution" + (end - start)  + "ms");

&& est utilisé dans l'expression conditionnelle de l'instruction if.

Programme qui n'effectue pas d'évaluation des courts-circuits

Test2


long start = System.currentTimeMillis();
boolean flag1 = false;
boolean flag2 = false;

for(long i=0; i<10000000000l; i++) {
    if(flag1 & flag2) {
        System.out.println("");
    }
}

long end = System.currentTimeMillis();
System.out.println("Temps d'exécution" + (end - start)  + "ms");

& Est utilisé dans l'expression conditionnelle pour if.

résultat de l'inspection

J'ai en fait exécuté les deux types de programmes ci-dessus et pris des statistiques sur le temps d'exécution de chaque programme. Le tableau ci-dessous montre les résultats.

Temps d'exécution du programme (unité: ms)
Avec évaluation des courts-circuits(&&) Aucune évaluation de court-circuit(&)
1ère fois 3546 3500
Deuxième fois 3556 3595
3e fois 3586 3565
4ème fois 3574 3564
5ème fois 3552 3636
6ème fois 3570 3620
7ème fois 3512 3568
8ème fois 3563 3597
9ème fois 3560 3565
10e fois 3555 3500
moyenne 3557.6 3571.0

En ce qui concerne la moyenne du tableau, on considère que la vitesse de traitement est plus rapide lorsque l'évaluation de court-circuit est effectuée. Cependant, dans cette expérience, le nombre d'échantillons était petit et la différence de temps d'exécution entre avec et sans évaluation de court-circuit était faible, le traitement est donc plus rapide en utilisant && avec évaluation de court-circuit que & sans évaluation de court-circuit. Les motifs sont un peu faibles pour conclure.

Résumé

Dans l'expérience que j'ai menée cette fois, j'ai obtenu le résultat que le traitement est plus rapide lors de l'utilisation de l'évaluation des courts-circuits. Pour le moment, il est préférable d'utiliser && en prenant le produit logique de plusieurs valeurs booléennes en Java. En outre, dans d'autres langues telles que C, & peut avoir une fonction complètement différente de prendre les deux côtés comme des nombres binaires et de prendre le produit logique pour chaque chiffre, de sorte que des erreurs peuvent survenir lors du changement de langue. Il est recommandé d'utiliser && si vous pouvez obtenir le même résultat en utilisant & et && en Java pour éviter qu'il n'augmente.

Recommended Posts

L'évaluation des courts-circuits est-elle vraiment rapide? Différence entre && et & en Java
Différence entre int et Integer en Java
Différence entre next () et nextLine () dans Java Scanner
[Java] Différence entre == et égal
[Java] Différence entre statique final et final dans les variables membres
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
[Java] Différence entre equals et == dans une chaîne de caractères qui est un type de référence
[Java] Différence entre Hashmap et HashTable
[Java] Différence entre array et ArrayList
[Java] Différence entre fermable et fermable automatiquement
[Java] Différence entre StringBuffer et StringBuilder
[Java] Différence entre longueur, longueur () et taille ()
[Java] Quelle est la différence entre form, entity et dto? [Haricot]
Différence entre pop () et peek () dans la pile
[Pour les débutants] Différence entre Java et Kotlin
Différence entre getText () et getAttribute () de Selenium
Différence entre "|| =" et "instance_variable_defined?" Dans Ruby memo
Différence entre les listes d'arry et les listes liées en Java
Différence entre EMPTY_ELEMENTDATA et DEFAULTCAPACITY_EMPTY_ELEMENTDATA dans ArrayList
[Java] Différence entre la plage Intstream et la plageClosed
Comprendre la différence entre int et Integer et BigInteger en java et float et double
[Java] Comprendre la différence entre List et Set
Quelle est la différence entre SimpleDateFormat et DateTimeFormatter? ??
Distinguer les nombres positifs et négatifs en Java
[Java] Différence entre "variable finale" et "objet immuable"
Différence entre vh et%
Différence entre i ++ et ++ i
Quelle est la différence entre System Spec et Feature Spec?
Différences entre les classes et les instances dans Ruby
Différence entre nouveau et créer dans le contrôleur d'action Rais
[Rails] Quelle est la différence entre la redirection et le rendu?
Quelle est la différence entre ignorer et en attente? [RSpec]
[Java débutant] Différence entre la longueur et la longueur () ~ Je ne sais pas ~
Quelle est la différence entre les responsabilités de la couche domaine et de la couche application dans l’architecture onion [DDD]
Différence entre produit et variante
Différence entre redirect_to et render
[Rails] Quelle est la différence entre l'installation et la mise à jour du bundle?
Différence entre Java et JavaScript (comment trouver la moyenne)
Différence entre redirect_to et render
Différence entre CUI et GUI
Différence entre les variables et les variables d'instance
Différence entre mockito-core et mockito-all
Différence entre l'élément 0, le caractère nul et le caractère vide (liste de contrôle)
[Java] Différence entre l’affectation d’une variable de type de base et l’affectation d’une variable de type de référence
Différence entre classe et instance
Différence entre l'installation de bundle et de bundle
Quelle est la différence entre une action et une méthode d'instance?
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
Différence entre ArrayList et LinkedList
Différence entre render et redirect_to
StringUtils.isNotBlank est pratique pour un jugement vide et un jugement nul en java
Pensez aux différences entre les fonctions et les méthodes (en Java)
Différence entre List et ArrayList
java Generics T et? Différence
Maintenant dans la troisième année, le malentendu que j'ai remarqué est la différence entre la méthode equals et ==
Différences dans la gestion des chaînes entre Java et Perl