Comment améliorer l'efficacité de l'utilisation de la réflexion Java
Dans notre travail quotidien ou nos entretiens, nous rencontrons souvent le point de connaissance de la « réflexion ». Grâce à la « réflexion », nous pouvons obtenir dynamiquement des informations sur les objets et appeler de manière flexible des méthodes d'objet, etc., mais en même temps, lors de leur utilisation, avec l'émergence d'un autre son, c'est-à-dire la « réflexion » est très lente et doit être utilisée avec parcimonie. La réflexion est-elle vraiment lente ? À quel point est-ce plus lent que lorsque nous créons habituellement des objets et appelons des méthodes ? Je suppose que beaucoup de gens ne l'ont jamais testé, ils l'ont simplement « entendu ». Faisons l'expérience directe de la « réflexion » directement à travers quelques cas de test.
Texte
Préparez l'objet de test
Définissez d'abord une classe de test TestUser, qui n'a que les attributs id et name, ainsi que leurs méthodes getter/setter, et un self- Définir la méthode sayHi.
public class TestUser { private Integer id; private String name; public String sayHi(){ return "hi"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Test pour créer 1 million d'objets
// 通过普通方式创建TestUser对象@Testpublic void testCommon(){ long start = System.currentTimeMillis(); TestUser user = null; int i = 0; while(i<1000000){ ++i; user = new TestUser(); } long end = System.currentTimeMillis(); System.out.println("普通对象创建耗时:"+(end - start ) + "ms"); }//普通对象创建耗时:10ms
// 通过反射方式创建TestUser对象@Testpublic void testReflexNoCache() throws Exception { long start = System.currentTimeMillis(); TestUser user = null; int i = 0; while(i<1000000){ ++i; user = (TestUser) Class.forName("ReflexDemo.TestUser").newInstance(); } long end = System.currentTimeMillis(); System.out.println("无缓存反射创建对象耗时:"+(end - start ) + "ms"); }//无缓存反射创建对象耗时:926ms
Dans les deux méthodes de test ci-dessus, l'auteur a testé chacune d'elles 5 fois, a pris une moyenne de leur consommation de temps et du résultat Vous pouvez voir de les résultats sont que l'un est de 10 ms et l'autre de 926 ms. Lorsque 1 million d'objets sont créés, la réflexion est en réalité environ 90 fois plus lente. wow ? L'écart est-il si grand ? La réflexion est-elle vraiment si lente ? Ensuite, l'auteur change la posture de réflexion et continue de la tester pour voir quel est le résultat ?
// 通过缓存反射方式创建TestUser对象@Testpublic void testReflexWithCache() throws Exception { long start = System.currentTimeMillis(); TestUser user = null; Class rUserClass = Class.forName("RefleDemo.TestUser"); int i = 0; while(i<1000000){ ++i; user = (TestUser) rUserClass.newInstance(); } long end = System.currentTimeMillis(); System.out.println("通过缓存反射创建对象耗时:"+(end - start ) + "ms"); }//通过缓存反射创建对象耗时:41ms
En fait, grâce au code, nous pouvons constater que la méthode Class.forName prend plus de temps. Elle appelle en fait une méthode locale, à travers laquelle la JVM est invitée à rechercher et à charger la classe spécifiée. Par conséquent, lorsque nous l'utilisons dans le projet, nous pouvons mettre en cache l'objet Class renvoyé par Class.forName et l'obtenir directement à partir du cache lors de sa prochaine utilisation, ce qui améliore considérablement l'efficacité d'obtention de Class. De la même manière, lorsque nous obtenons un constructeur, une méthode et d'autres objets, nous pouvons également les mettre en cache pour éviter une création fastidieuse à chaque utilisation.
Test de la méthode d'appel réflexif
@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis(); Class testUserClass = Class.forName("RefleDemo.TestUser"); TestUser testUser = (TestUser) testUserClass.newInstance(); Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){ ++i; method.invoke(testUser); } long end = System.currentTimeMillis(); System.out.println("反射调用方法耗时:"+(end - start ) + "ms"); }//反射调用方法耗时:330ms
@Testpublic void testReflexMethod() throws Exception { long start = System.currentTimeMillis(); Class testUserClass = Class.forName("RefleDemo.TestUser"); TestUser testUser = (TestUser) testUserClass.newInstance(); Method method = testUserClass.getMethod("sayHi"); int i = 0; while(i<100000000){ ++i; method.setAccessible(true); method.invoke(testUser); } long end = System.currentTimeMillis(); System.out.println("setAccessible=true 反射调用方法耗时:"+(end - start ) + "ms"); }//setAccessible=true 反射调用方法耗时:188ms
Ici, nous réfléchissons et appelons la méthode sayHi 100 millions de fois. Après avoir appelé method.setAccessible(true), avons constaté qu'elle est presque moitié plus rapide<.>. En regardant l'API, nous pouvons voir que jdk effectuera des contrôles d'accès de sécurité lors de la définition du champ d'acquisition et des méthodes d'appel, et de telles opérations prendront beaucoup de temps, donc vous pouvez désactiver les contrôles de sécurité via setAccessible(true), ainsi améliorant l'efficacité de la réflexion.
Réflexion ultimeEn plus des méthodes ci-dessus, existe-t-il un moyen d'utiliser la réflexion à l'extrême ? Nous présentons ici ReflectASM, une boîte à outils de réflexion haute performance. Il s'agit d'un mécanisme de réflexion implémenté via la génération de bytecode. Ce qui suit est une comparaison des performances avec la réflexion Java.Conclusion
Enfin, pour résumer, afin de mieux utiliser la réflexion, nous devons charger la configuration pertinente et les données requises pour la réflexion dans la mémoire au démarrage du projet , puis exécuter Chaque étape récupère ces métadonnées du cache pour les opérations de réflexion. Il ne faut pas avoir peur de la réflexion. La machine virtuelle est constamment optimisée, tant que nous utilisons la bonne méthode, ce n'est pas aussi lent que « la rumeur ». Lorsque nous avons la recherche ultime de la performance, nous pouvons envisager. utiliser des packages tiers pour coder directement pour fonctionner.
Tutoriels associés : Tutoriel vidéo Java
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L’agent IA de DeepMind est de nouveau au travail ! Attention, ce type nommé BBF a maîtrisé 26 jeux Atari en seulement 2 heures. Son efficacité est équivalente à celle des humains, surpassant tous ses prédécesseurs. Vous savez, les agents d'IA ont toujours été efficaces pour résoudre des problèmes grâce à l'apprentissage par renforcement, mais le plus gros problème est que cette méthode est très inefficace et nécessite beaucoup de temps à explorer. Picture La avancée apportée par BBF se situe en termes d'efficacité. Pas étonnant que son nom complet puisse être appelé Bigger, Better ou Faster. De plus, il peut effectuer une formation sur une seule carte et les besoins en puissance de calcul sont également considérablement réduits. BBF a été proposé conjointement par Google DeepMind et l'Université de Montréal, et les données et le code sont actuellement open source. L'humain le plus élevé possible

PyCharm est un puissant environnement de développement intégré (IDE) Python largement utilisé par les développeurs Python pour l'écriture de code, le débogage et la gestion de projets. Dans le processus de développement réel, la plupart des développeurs seront confrontés à différents problèmes, tels que comment améliorer l'efficacité du développement, comment collaborer avec les membres de l'équipe sur le développement, etc. Cet article présentera un guide pratique du développement à distance de PyCharm pour aider les développeurs à mieux utiliser PyCharm pour le développement à distance et à améliorer l'efficacité du travail. 1. Travail de préparation dans PyCh

StableDiffusion est un modèle d'apprentissage profond open source. Sa fonction principale est de générer des images de haute qualité via des descriptions textuelles et prend en charge des fonctions telles que la génération de graphiques, la fusion de modèles et la formation de modèles. L'interface de fonctionnement du modèle est visible dans la figure ci-dessous. Comment générer une image. Ce qui suit est une introduction au processus de création d'une image d'un cerf buvant de l'eau. Lors de la génération d'une image, elle est divisée en mots d'invite et en mots d'invite négatifs. Lors de la saisie des mots d'invite, vous devez la décrire. clairement et essayez de décrire la scène, l’objet, le style et la couleur que vous souhaitez en détail. Par exemple, au lieu de simplement dire « le cerf boit de l'eau », il est écrit « un ruisseau, à côté d'arbres denses, et il y a des cerfs qui boivent de l'eau à côté du ruisseau ». Les mots d'invite négatifs vont dans la direction opposée. aucun bâtiment, aucune personne, aucun pont, aucune clôture et une description trop vague peuvent conduire à des résultats inexacts.

La réflexion Java est un outil puissant qui vous permet d'accéder aux champs et méthodes privés d'une classe, révélant ainsi le fonctionnement interne du logiciel. Ceci est utile dans des domaines tels que l'ingénierie inverse, l'analyse de logiciels et le débogage. Pour utiliser la réflexion Java, vous devez d'abord importer le package java.lang.reflect. Ensuite, vous pouvez utiliser la méthode Class.forName() pour obtenir l'objet Class d'une classe. Une fois que vous disposez d’un objet Class, vous pouvez utiliser différentes méthodes pour accéder aux champs et méthodes de la classe. Par exemple, vous pouvez utiliser la méthode getDeclaredFields() pour obtenir tous les champs d'une classe, y compris les champs privés. Vous pouvez également utiliser la méthode getDeclaredMethods()

Avec le développement rapide d’Internet, l’importance des bases de données est devenue de plus en plus importante. En tant que développeur Java, nous impliquons souvent des opérations de base de données. L'efficacité du traitement des transactions de base de données est directement liée aux performances et à la stabilité de l'ensemble du système. Cet article présentera certaines techniques couramment utilisées dans le développement Java pour optimiser l'efficacité du traitement des transactions de base de données afin d'aider les développeurs à améliorer les performances du système et la vitesse de réponse. Opérations d'insertion/mise à jour par lots Normalement, l'efficacité de l'insertion ou de la mise à jour d'un seul enregistrement dans la base de données en une seule fois est bien inférieure à celle des opérations par lots. Par conséquent, lors de l'exécution d'une insertion/mise à jour par lots

Titre : Python rend la vie plus pratique : maîtrisez ce langage pour améliorer l'efficacité du travail et la qualité de vie. En tant que langage de programmation puissant et facile à apprendre, Python devient de plus en plus populaire à l'ère numérique d'aujourd'hui. Non seulement pour écrire des programmes et effectuer des analyses de données, Python peut également jouer un rôle important dans notre vie quotidienne. La maîtrise de cette langue peut non seulement améliorer l'efficacité du travail, mais également améliorer la qualité de vie. Cet article utilisera des exemples de code spécifiques pour démontrer la large application de Python dans la vie et aider les lecteurs

Pour maîtriser le rôle de sessionStorage et améliorer l'efficacité du développement front-end, des exemples de code spécifiques sont nécessaires. Avec le développement rapide d'Internet, le domaine du développement front-end évolue également chaque jour. Lors du développement front-end, nous devons souvent traiter de grandes quantités de données et les stocker dans le navigateur pour une utilisation ultérieure. SessionStorage est un outil de développement frontal très important qui peut nous fournir des solutions de stockage local temporaire et améliorer l'efficacité du développement. Cet article présentera le rôle de sessionStorage,

Le rôle du masque de sous-réseau et son impact sur l'efficacité de la communication réseau Introduction : Avec la popularité d'Internet, la communication réseau est devenue un élément indispensable de la société moderne. Dans le même temps, l'efficacité de la communication en réseau est également devenue l'un des centres d'attention des gens. Dans le processus de création et de gestion d'un réseau, le masque de sous-réseau est une option de configuration importante et basique, qui joue un rôle clé dans la communication réseau. Cet article présentera le rôle du masque de sous-réseau et son impact sur l'efficacité des communications réseau. 1. Définition et fonction du masque de sous-réseau Masque de sous-réseau (subnetmask)
