Vérification de l'impact sur les performances lors de l'utilisation de Java volatile

Aperçu

Une page de mémo qui vérifie l'impact sur les performances lors de l'utilisation de volatile.

Qu'est-ce qui est volatile

Qualificatif attaché au terrain. Pour les programmes multithread, le thread peut mettre en cache la valeur du champ. Si vous ajoutez volatile, vous pouvez l'exclure du cache. (Les détails sur le rôle de volatile sont omis sur cette page.)

Vérification des performances

Environnement utilisé pour la vérification des performances

** Spécifications de la machine ** CPU:Intel(R) Core(TM) i5-2400S CPU RAM:8GB Système d'exploitation: windows10 64 bits

** Environnement d'exécution ** Eclipse(2020-03 (4.15.0)) Java8

Performances lors de l'utilisation de volatile

Mesurez le temps de traitement pour compter le champ de type int 100 millions de fois avec l'ajout de volatile.

    private volatile int cnt = 0;

    private long exe() {

        long start = System.currentTimeMillis();

        for (int i = 0; i < 100000000; i++) {
            this.cnt++;
        }

        long end = System.currentTimeMillis();

        return end - start;
    }

Mesuré avec le code ci-dessus 10 fois et obtenu la valeur moyenne.

résultat Valeur moyenne: 964ms

Performance sans volatile

À partir du code ci-dessus, modifiez le champ en un formulaire qui n'utilise pas volatile.

    private int cnt = 0;

De même, la mesure a été effectuée 10 fois et la valeur moyenne a été obtenue.

résultat Valeur moyenne: 7ms

Résumé

Les performances seront pires lorsque volatile est utilisé, mais cela n'affectera pas dans la plupart des cas car il faut environ le temps ci-dessus pour compter jusqu'à 100 millions de fois.

Recommended Posts

Vérification de l'impact sur les performances lors de l'utilisation de Java volatile
Gestion des fuseaux horaires avec Java
Exception inattendue lors de l'utilisation de DateTimeFormatter de Java
Résumé de la programmation orientée objet utilisant Java
J'ai essayé d'utiliser Google HttpClient de Java
Surveillance de l'état des applications Java à l'aide d'Elasticsearch
Acquisition du contenu d'entrée à l'aide de Scanner (Java)
Spécifiez ClassPath lors de l'utilisation de jupyter + Java avec WSL
Essayez une recherche similaire de recherche d'images à l'aide du SDK Java [Recherche]
Un exemple où il est plus rapide d'utiliser l'addition que d'utiliser StringBuilder (Java)
Histoire de l'automatisation des tests avec Appium [Android / java]
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Vérification de [email protected]
[Java] Présentation de Java
N'oubliez pas setCalendar ou setTimeZone lorsque vous utilisez Java DateFormat
[Rails] Lorsque vous utilisez ajax, faites attention aux "mesures CSRF".
[Java] Lors de l'écriture du source ... Mémorandum ①
Vérification des performances de l'optimisation du plan Red Hat Decision Manager
Différences de code lors de l'utilisation du système de longueur en Java
[Java] Éléments à prendre en compte lors de la sortie de FizzBuzz
[Java10] Veillez à utiliser ensemble var et génériques