La réflexion affecte-t-elle les performances Java ?
Créer des objets à l'aide de la réflexion, plutôt que d'appeler directement le constructeur de classe, entraîne sans aucun doute des pénalités de performances importantes. Les opérations de réflexion nécessitent une résolution de type dynamique, ce qui entrave les optimisations de la machine virtuelle Java.
La documentation Java sur la réflexion reconnaît cette différence de performances : "Étant donné que la réflexion implique des types résolus dynamiquement, certaines optimisations de la machine virtuelle Java ne peuvent pas être effectuées... réfléchies les opérations ont des performances plus lentes que leurs homologues non réfléchissantes. "
Un simple test révèle le différence :
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 < 1000000; 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 < 1000000; i++) { A a = (A) Class.forName("misc.A").newInstance(); a.doSomething(); } System.out.println(System.currentTimeMillis() - start); } }
Résultats :
Notez que ce test inclut à la fois la recherche et l'instanciation, mais même l'isolement de l'instanciation aboutit à un pénalité :
Ainsi, alors que les performances peuvent varier en fonction sur le contexte spécifique, elle reste significative lors du recours à la réflexion.
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!