Maison >Java >javaDidacticiel >Dans quelle mesure l'utilisation de Reflection a-t-elle un impact sur les performances de création d'objets en Java ?

Dans quelle mesure l'utilisation de Reflection a-t-elle un impact sur les performances de création d'objets en Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-03 08:41:13856parcourir

How Much Does Using Reflection Impact Object Creation Performance in Java?

Impact de la réflexion sur les performances de création d'objets en Java

Lorsque les développeurs utilisent les capacités de réflexion de Java pour instancier des objets, des inquiétudes surgissent souvent quant aux performances ultérieures. implications. Pour évaluer ces problèmes, examinons si la création d'objets à l'aide de la réflexion plutôt que d'invoquer directement le constructeur de classe introduit des différences de performances significatives.

Selon la documentation officielle de Java sur la réflexion, il existe effectivement un impact notable sur les performances. Étant donné que la réflexion implique une résolution dynamique des types, certaines optimisations JVM ne peuvent pas être appliquées. Cela conduit à ce que les opérations réfléchissantes soient intrinsèquement plus lentes que leurs homologues non réfléchissantes.

Pour quantifier cette différence, considérez l'extrait de code suivant :

public class Main {

    public static void main(String[] args) throws Exception {
        doRegular();
        doReflection();
    }

    public static void doRegular() throws Exception {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1,000,000; i++) {
            A a = new A();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public static void doReflection() throws Exception {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1,000,000; i++) {
            A a = (A) Class.forName("misc.A").newInstance();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }
}

class A {
    public void doSomeThing() {
        // Perform some task
    }
}

Exécuter ce code sur un système Sun JRE 6u10 donne les résultats suivants :

  • Création d'objet régulière : 35 millisecondes
  • Création d'objets à l'aide de la réflexion : 465 millisecondes

Ces résultats démontrent une pénalité de performances significative lors de l'utilisation de la réflexion, qui est attribuée au coût d'exécution des recherches et de l'instanciation des classes d'exécution.

Même si nous optimisons le code de réflexion en effectuant la recherche de classe une seule fois avant d'instancier plusieurs objets, il y a toujours une performance hit :

  • Création d'objet régulière : 30 millisecondes
  • Création d'objet par réflexion avec une seule recherche : 47 millisecondes

En conclusion, la réflexion en Java entraîne un surcharge de performances substantielle par rapport aux invocations directes du constructeur. Bien qu'il puisse y avoir des cas d'utilisation spécifiques où une réflexion est nécessaire, il est important de prendre en compte les implications potentielles en termes de performances lors de l'examen de son utilisation, en particulier dans les applications critiques en termes de performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn