[JAVA] Sortez avec un suffixe sur la méthode 2

introduction

Cet article est une suite de Sortez avec une méthode suffixée. Veuillez noter que certaines pièces sont légèrement cassées.

Ce qui m'intéressait

Dernier article était juste un soulagement du stress, mais j'étais préoccupé par les performances. Je veux savoir à quel point l'accès à l'API de réflexion est lent.

Apparemment avec ça

Pour le moment, je l'ai laissé vomir pendant un moment.

suffixMethodsCaller.java


package suffixMethodsCall;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class suffixMethodsCaller {

	/**
	 * <pre>
	 *Exécutez tous les getters avec le suffixe inclus dans suffixMethods,
	 *Vérifiez que le matchTargetCode au début est inclus.
	 * </pre>
	 */
	public static void main(String[] args) {

		//Début de la mesure
		long measureStart = System.currentTimeMillis();

		//Chaîne de caractères à mettre en correspondance
		String matchTargetCode = "J";
		//Liste de codes obtenue à partir de la méthode avec suffixe
		List<String> codeList = new ArrayList<String>();

		//Spécifiez la classe et la méthode sous forme de chaîne de caractères
		suffixMethods sm = new suffixMethods();
		String clazz = sm.getClass().getName();
		String baseSuffixMethod = "getReturnCode";
		int suffixPartStart = 1;
		int suffixPartEnd = 10;

		//Exécuter une méthode avec suffixe en utilisant la réflexion
		try {
			Class<?> c = Class.forName(clazz);
			Object myObj = c.newInstance();

			//Bouclez la partie suffixe et plongez dans la liste de codes
			for ( ; suffixPartStart <= suffixPartEnd; suffixPartStart++) {
				//Paramètres de la méthode d'exécution
				Method m = c.getMethod(baseSuffixMethod + String.format("%02d", suffixPartStart));
				//Pack dans la liste de codes
				codeList.add(m.invoke(myObj).toString());
			}
		} catch(ReflectiveOperationException e) {
			e.printStackTrace();
		}

		//Sortie avec booléen si la chaîne de caractères à mettre en correspondance est incluse dans la liste des résultats d'exécution de la méthode avec suffixe
		System.out.println(codeList.contains(matchTargetCode));

		//La mesure est terminée!
		long measureEnd = System.currentTimeMillis();
		System.out.println((measureEnd - measureStart) + "ms");
	}
}

Résultat d'exécution


true
44ms

Je vois je vois. Ensuite, devenons fous.

suffixMethodsCaller2.java


package suffixMethodsCall;

public class suffixMethodsCaller2 {

	/**
	 * <pre>
	 *Exécutez tous les getters avec le suffixe inclus dans suffixMethods,
	 *Vérifiez que le matchTargetCode au début est inclus.
	 * </pre>
	 */
	public static void main(String[] args) {

		//Début de la mesure
		long measureStart = System.currentTimeMillis();

		//Chaîne de caractères à mettre en correspondance
		String matchTargetCode = "J";

		suffixMethods sm = new suffixMethods();

		//Sortie avec booléen si la chaîne de caractères à mettre en correspondance est incluse dans la liste des résultats d'exécution de la méthode avec suffixe
		System.out.println(sm.getReturnCode01().equals(matchTargetCode) || sm.getReturnCode02().equals(matchTargetCode)
				|| sm.getReturnCode03().equals(matchTargetCode) || sm.getReturnCode04().equals(matchTargetCode)
				|| sm.getReturnCode05().equals(matchTargetCode) || sm.getReturnCode06().equals(matchTargetCode)
				|| sm.getReturnCode07().equals(matchTargetCode) || sm.getReturnCode08().equals(matchTargetCode)
				|| sm.getReturnCode09().equals(matchTargetCode) || sm.getReturnCode10().equals(matchTargetCode));

		//La mesure est terminée!
		long measureEnd = System.currentTimeMillis();
		System.out.println((measureEnd - measureStart) + "ms");
	}
}

Résultat d'exécution


true
1ms

e. .. .. ?? vraiment? Cela fait une telle différence.

J'étais un peu inquiet, donc un autre. C'est une mauvaise phrase, mais je veux inverser la vérité et voir s'il y a un changement. J'ai amélioré la précision de nanoTime.

suffixMethodsCaller3.java


package suffixMethodsCall;

public class suffixMethodsCaller3 {

	/**
	 * <pre>
	 *Exécutez tous les getters avec le suffixe inclus dans suffixMethods,
	 *Vérifiez que le matchTargetCode au début est inclus.
	 * </pre>
	 */
	public static void main(String[] args) {

		//Début de la mesure
		long measureStart = System.nanoTime();

		//Chaîne de caractères à mettre en correspondance
		String matchTargetCode = "J";

		suffixMethods sm = new suffixMethods();

		//Sortie avec booléen si la chaîne de caractères à mettre en correspondance est incluse dans la liste des résultats d'exécution de la méthode avec suffixe
		System.out.println(!sm.getReturnCode01().equals(matchTargetCode) && !sm.getReturnCode02().equals(matchTargetCode)
				&& !sm.getReturnCode03().equals(matchTargetCode) && !sm.getReturnCode04().equals(matchTargetCode)
				&& !sm.getReturnCode05().equals(matchTargetCode) && !sm.getReturnCode06().equals(matchTargetCode)
				&& !sm.getReturnCode07().equals(matchTargetCode) && !sm.getReturnCode08().equals(matchTargetCode)
				&& !sm.getReturnCode09().equals(matchTargetCode) && !sm.getReturnCode10().equals(matchTargetCode));

		//La mesure est terminée!
		long measureEnd = System.nanoTime();
		System.out.println((measureEnd - measureStart) + "ns");
	}
}

C'est difficile à lire.

Résultat d'exécution


false
1127314ns

Hmm. Je vais essayer de faire la précédente nano-commande.

Résultat d'exécution


true
1100219ns

Oh. Je l'ai essayé plusieurs fois et le résultat était presque le même. C'est juste la supériorité ou l'infériorité de la lisibilité. J'ai beaucoup appris.

Cependant, je suis surpris de la lenteur lors de l'utilisation de la réflexion. Est-ce parce qu'il y a une déclaration for? Le résultat était le même même si je pensais avoir perdu la boucle.

à la fin

La réflexion ne semble pas recommandée pour les applications métiers, Personnellement, je l'aime car il peut être utilisé de manière très intéressante pour les utilitaires internes, etc.

Cet article a commencé avec le soulagement du stress, mais lorsque j'ai bougé mes mains, j'ai beaucoup appris. J'espère que cela sera utile à n'importe qui.

Recommended Posts

Sortez avec un suffixe sur la méthode
Sortez avec un suffixe sur la méthode 2
[Ruby] Découpez une chaîne de caractères à l'aide de la méthode slice
Je suis immédiatement tombé sur la méthode d'entrée standard avec AtCoder.
Simuler la méthode simplex avec GUI
Programmation avec ruby (en route)
Logique pour dessiner un cercle sur la console avec l'art ASCII
Connexion à une base de données avec Java (partie 1) Peut-être la méthode de base
Mes réflexions sur la méthode d'égalité (Java)
Déclarez une méthode qui a une valeur de retour Java avec le type de données de valeur de retour
Créez un fichier jar avec la commande
Appelle la chaîne de caractères passée comme argument en tant que méthode avec send
Une note sur la classe Utils libGDX
Exécutez DMN à l'aide du moteur Camunda DMN
Utiliser le format nommé avec la méthode de format de Ruby
Hello World, une application d'interface graphique multiplateforme avec Groovy fonctionnant sur la plate-forme Java
Une note rapide sur l'utilisation de jshell avec l'image Docker officielle du JDK
Utilisez des modèles sur le chemin de classe avec Apache Velocity
Publiez l'application avec ruby on rails
Correspond aux annotations sur l'interface avec Spring AOP
Créer une carte multi-touches avec une bibliothèque standard
Déterminez la page actuelle avec Ruby on Rails
J'ai fait un portfolio avec Ruby On Rails
À propos de la méthode
[Java] Découpez une partie de la chaîne de caractères avec Matcher et des expressions régulières
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
L'histoire de la création d'un proxy inverse avec ProxyServlet
Afficher la liste en setDétails à l'écran avec ressort-sécurité
Pourquoi implémenter avec singleton au lieu de la méthode statique
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
[Rails] Que faire lorsque la vue se réduit lorsqu'un message est affiché avec la méthode des erreurs