[JAVA] La question de savoir quel est le meilleur, si ou changer

introduction

―― Combien de fois avez-vous écrit si depuis que vous avez codé? Lol ――Même si vous écrivez des dizaines de milliers de fois, vous vous demandez parfois s'il faut utiliser switch ou si, non? ?? (Je suis peut-être inquiet)

Mes critères de sélection actuels

-Lors du choix d'une instruction if:&&Et||Quand tu veux

Lequel fonctionnera le mieux lorsque vous jouerez l'un ou l'autre?

――Si vous êtes intéressé, vous devriez le mesurer, non? je pense

Ce que vous avez préparé

Table des matières (ce qui est censé être fait au moment de la rédaction du tableau)

Entraine toi

Exécutez la branche dans une boucle d'environ 100 fois

--Le code exécuté est ci-dessous

CheckPerformance.java


import java.util.stream.IntStream;

public class CheckPerformance {

    public static void main(String[] args) {
        Long start = System.currentTimeMillis();
        //si exécution
        IntStream.rangeClosed(0, 100).forEach(i -> {
            if (i % 2 == 0) {
                System.out.println("Est même");
            } else if (i % 2 == 1) {
                System.out.println("Est impair");
            } else {
                System.out.println("Autre");
            }
        });

        //Exécution du commutateur
        IntStream.rangeClosed(0, 100).forEach(i -> {
            switch (i % 2) {
                case 0:
                    System.out.println("Est même");
                    break;
                case 1:
                    System.out.println("Est impair");
                    break;
                default:
                    System.out.println("Autre");
                    break;
            }
        });
        Long end = System.currentTimeMillis();
        System.out.println(end - start + "ms");
    }
}
Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 7ms 12ms
Deuxième fois 15ms 10ms
Troisième fois 13ms 12ms
4e 8ms 15ms
5ème fois 10ms 10ms

Vérification

«Je l'ai couru plusieurs fois, mais c'est devenu comme un jeu de chance, alors j'ai décidé qu'il serait difficile de vérifier la différence de performance avec 100 fois.

Exécutez une branche dans une boucle de 1000 fois

--Source omise

Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 36ms 39ms
Deuxième fois 33ms 35ms
Troisième fois 31ms 28ms
4e 38ms 39ms
5ème fois 38ms 34ms

Vérification

――Hmm, il est subtil de vérifier la différence de performance même 1000 fois «J'ai toujours le sentiment que c'est dans la catégorie de l'erreur ici.

Exécutez la branche en 10000 boucles

--La source est (ry

Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 133ms 119ms
Deuxième fois 147ms 136ms
Troisième fois 116ms 121ms
4e 135ms 130ms
5ème fois 128ms 136ms

Vérification

――Hmm, même 10000 fois ... (ry

Exécutez la branche en 100 000 boucles

--La source est (ry

Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 903ms 917ms
Deuxième fois 947ms 885ms
Troisième fois 1012ms 964ms
4e 1109ms 947ms
5ème fois 943ms 884ms

Vérification

«Je pense qu'il y avait une légère différence de performance après 100 000 fois. ――Le commutateur a dépassé 1 seconde 0 fois, mais il y a 2 ifs. ――Cependant, l'erreur peut être une erreur, et si vous ne regardez que la valeur moyenne, le changement peut être plus rapide? L'hypothèse est venue ――Mais je suis un peu inquiet, alors je vais ajouter un autre chiffre et l'exécuter.

Exécutez une branche dans une boucle de 1 000 000 fois

Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 6366ms 6339ms
Deuxième fois 6410ms 6396ms
Troisième fois 6794ms 6298ms
4e 6730ms 6248ms
5ème fois 6823ms 6495ms

Vérification

Augmenter le nombre de succursales

«Donc, je suis satisfait dans une certaine mesure, donc je vais augmenter le nombre de succursales. «À partir de là, j'ai trouvé que cela n'a pas beaucoup de sens de faire 100 cas, donc je vais effectuer avec 1 million de cas.

Tout d'abord, faites trois branches

--Omettre la source

Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 6348ms 6476ms
Deuxième fois 6751ms 6354ms
Troisième fois 6461ms 6324ms
4e 6500ms 6411ms
5ème fois 6537ms 6646ms

Vérification

――Vous pouvez voir la différence de performance après 3 branches. ――Lorsque vous regardez la valeur moyenne, le changement est un peu plus rapide, n'est-ce pas? ――Cependant, cela peut être une erreur, alors augmentez le nombre de branches.

Faire 5 branches

«J'en ai choisi cinq en raison de la commodité du calcul et de mon humeur.

Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 6528ms 6279ms
Deuxième fois 6452ms 6507ms
Troisième fois 6661ms 6599ms
4e 6501ms 6589ms
5ème fois 6608ms 6322ms

Vérification

Conclusion

Il n'y a pratiquement aucune différence de performances entre if et switch!

C'est une question d'attraper le titre, mais c'est ma conclusion «Je n'ai exécuté qu'un million de dossiers, mais je suis conscient que cela peut changer si d'autres sont ajoutés. Cependant, il semble que les performances ne changent pas de manière significative entre if et switch en fonction du nombre de branches et du nombre de processus, donc je pense qu'il est correct de choisir une implémentation plus facile à lire en fonction du temps. ――Si quelque chose ne va pas, ou si vous devriez le vérifier plus comme ça, veuillez laisser un commentaire ou une demande de modification!

Postscript

--Dans le commentaire, vous avez souligné que println est trop lourd, j'ai donc essayé de le réparer.

Main.java


import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;

public class Main {

    public static void main(String[] args) {

        long start = System.currentTimeMillis();

        IntStream.rangeClosed(0, 10000000).forEach(
                num -> {
                    if (num % 2 == 0) {
                        int num2 = 2;
                    } else if (num % 2 == 1){
                        int num3 = 2;
                    } else {
                        int num4 = 2;
                    }
                }
        );
        IntStream.rangeClosed(0, 10000000).forEach(
                num -> {
                    switch (num % 2) {
                        case 0:
                            int num2 = 2;
                            break;
                        case 1:
                            int num3 = 2;
                            break;
                        default:
                            int num4 = 2;
                            break;
                    }
                }
                        );
        long end = System.currentTimeMillis();
        System.out.println((end - start)  + "ms");

    }
}

Résultat d'exécution

Xème fois nombre de secondes à exécuter si Nombre de secondes pour exécuter le commutateur
1ère fois 79ms 70ms
Deuxième fois 81ms 64ms
Troisième fois 90ms 62ms
4e 86ms 67ms
5ème fois 83ms 63ms

«Il y avait une différence de performance d'environ 20 ms après avoir tourné 10 millions de caisses, mais je me demande s'il n'y a pas de problème avec la conclusion qu'il n'y a presque pas de différence. ――La validation du code d'octet se fera à une date ultérieure!

Recommended Posts

La question de savoir quel est le meilleur, si ou changer
Quel est le meilleur, Kotlin ou futur Java?
Java: dont le problème est plus rapide, en flux ou en boucle
Quel est le plus rapide, taille ou 0, comme argument de List # toArray?
[6 sélections de comparaison d'outils de formulaire] Quel est le meilleur, open source ou commercial?
La méthode de la fonction primitive spécialisée IntFunction s'applique-t-elle ou applyAsInt?
Qu'est-ce qui est mieux, généralisation ou délégation, quand il y a des chevauchements?
Quel est le meilleur client HTTP pour Java?
'% 02d' Quel est le% de% 2?
Qu'est-ce que @Override ou @SuppressWarnings ("SleepWhileInLoop") devant la fonction? ?? ??
Changez la conversation en fonction du jour d'aujourd'hui
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
[Java] Vérifiez si la chaîne de caractères est composée uniquement de blancs (= Vierge)
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
Quelle est la structure des données d'ActionText?
[Swift] Si le support de l'application est iOS 11 ou version ultérieure, il n'était pas nécessaire d'utiliser correctement Int et Int64
Qu'est-ce que JSP? ~ Connaissons les bases de JSP !! ~
Le trait de soulignement ActiveSupport n'est pas la conversion inverse de camelize
L'ordre des modificateurs de méthode Java est fixe
Qui est plus rapide, référence de méthode ou expression lambda
Le nom officiel de Spring MVC est Spring Web MVC
Quel est le plus rapide, Array # sample ou Random # rand?
[Août 2020] Si l'installation de cool.io / puma échoue
Première touche de la classe Files (ou Java 8)
La fin de la programmation catastrophique # 03 "Comparaison d'entiers, si" a> b ", supposons que c'est" a --b> 0 ""