SLF4J - Profilage
SLF4J Distribution fournit slf4j-ext.jar il contient des API pour les fonctionnalités telles que le profilage, la journalisation étendue, la journalisation des événements et la journalisation avec l'agent Java.
Profilage
Parfois, le programmeur veut mesurer certains attributs comme l'utilisation de la mémoire, la complexité du temps ou l'utilisation d'instructions particulières sur les programmes pour mesurer la capacité réelle de ce programme. Ce type de mesure du programme s'appelle le profilage. Le profilage utilise une analyse de programme dynamique pour effectuer une telle mesure.
SLF4J fournit une classe nommée Profiler dans le org.slf4j.profilerpackage à des fins de profilage. C'est ce qu'on appelle le profileur du pauvre. Grâce à cela, le programmeur peut connaître le temps nécessaire pour effectuer des tâches prolongées.
Profilage à l'aide de la classe Profiler
Le profileur contient des chronomètres et des chronomètres enfants et nous pouvons les démarrer et les arrêter en utilisant les méthodes fournies par la classe profiler.
Pour poursuivre le profilage à l'aide de la classe profiler, suivez les étapes ci-dessous.
Étape 1 - Instancier la classe du profileur
Instanciez la classe Profiler en passant une valeur String représentant le nom du profileur. Lorsque nous instancions une classe Profiler, un chronomètre global sera lancé.
//Creating a profiler
Profiler profiler = new Profiler("Sample");
Étape 2 - Démarrer un chronomètre enfant
Lorsque nous invoquons le start() méthode, il démarrera un nouveau chronomètre enfant (nommé) et arrête les chronomètres enfants précédents (ou instruments de temps).
Invoquez le start() méthode de la Profiler class en passant une valeur String représentant le nom du chronomètre enfant à créer.
//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
Après avoir créé ces chronomètres, vous pouvez effectuer vos tâches ou appeler ces méthodes qui exécutent vos tâches.
Étape 3: Démarrez un autre chronomètre enfant (si vous le souhaitez)
Si vous en avez besoin, créez un autre chronomètre à l'aide du start()méthode et exécutez les tâches requises. Si vous le faites, il démarrera un nouveau chronomètre et arrêtera le précédent (c'est-à-dire la tâche 1).
//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
Étape 4: Arrêtez les montres
Lorsque nous invoquons le stop() méthode, il arrêtera le chronomètre enfant récent et le chronomètre global et retournera l'instrument de temps actuel.
// Stopping the current child stopwatch and the global stopwatch.
TimeInstrument tm = profiler.stop();
Étape 5: Imprimez le contenu de l'instrument de temps.
Imprimez le contenu de l'instrument d'heure actuelle à l'aide du print() méthode.
//printing the contents of the time instrument
tm.print();
Exemple
L'exemple suivant illustre le profilage à l'aide de la classe Profiler de SLF4J. Ici, nous avons pris deux exemples de tâches, en imprimant la somme des carrés des nombres de 1 à 10000, en imprimant la somme des nombres de 1 à 10000. Nous essayons d'obtenir le temps nécessaire pour ces deux tâches.
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample obj = new ProfilerExample();
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//printing the contents of the time instrument
tm.print();
}
}
Production
Lors de l'exécution, le programme ci-dessus génère la sortie suivante -
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000
+ Profiler [BASIC]
|-- elapsed time [Task 1] 2291.827 microseconds.
|-- elapsed time [Task 2] 225.802 microseconds.
|-- Total [BASIC] 3221.598 microseconds.
Journalisation des informations du profileur
Au lieu d'imprimer le résultat d'un profileur pour consigner ces informations, vous devez -
Créez un enregistreur à l'aide du LoggerFactory classe.
Créez un profileur en instanciant la classe Profiler.
Associez le logger au profiler en passant l'objet logger créé au setLogger() méthode de la Profiler classe.
Enfin, au lieu d'imprimer le journal, les informations du profileur à l'aide du log() méthode.
Exemple
Dans l'exemple suivant, contrairement au précédent (au lieu d'imprimer), nous essayons de consigner le contenu de l'instrument de temps.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample_logger {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample_logger obj = new ProfilerExample_logger();
//Creating a logger
Logger logger = LoggerFactory.getLogger(ProfilerExample_logger.class);
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Adding logger to the profiler
profiler.setLogger(logger);
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//Logging the contents of the time instrument
tm.log();
}
}
Production
Lors de l'exécution, le programme ci-dessus génère la sortie suivante.
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000