SLF4J-プロファイリング

SLF4Jディストリビューションは提供します slf4j-ext.jar これには、プロファイリング、拡張ロギング、イベントロギング、Javaエージェントによるロギングなどの機能のためのAPIが含まれています。

プロファイリング

プログラマーは、メモリの使用、時間の複雑さ、プログラムに関する特定の命令の使用などの属性を測定して、そのプログラムの実際の機能を測定したい場合があります。プログラムに関するこのような測定は、プロファイリングと呼ばれます。プロファイリングは、動的プログラム分析を使用してそのような測定を行います。

SLF4Jは、という名前のクラスを提供します Profiler の中に org.slf4j.profilerプロファイリング用のパッケージ。これは貧乏人のプロファイラーとして知られています。これを使用して、プログラマーは長時間のタスクを実行するのにかかる時間を知ることができます。

プロファイラークラスを使用したプロファイリング

プロファイラーにはストップウォッチと子ストップウォッチが含まれており、プロファイラークラスが提供するメソッドを使用してこれらを開始および停止できます。

プロファイラークラスを使用してプロファイリングを続行するには、以下の手順に従います。

ステップ1-プロファイラークラスをインスタンス化する

プロファイラーの名前を表す文字列値を渡して、プロファイラークラスをインスタンス化します。プロファイラークラスをインスタンス化すると、グローバルストップウォッチが開始されます。

//Creating a profiler
Profiler profiler = new Profiler("Sample");

ステップ2-子ストップウォッチを開始する

を呼び出すと start() メソッドは、新しい子ストップウォッチ(名前付き)を開始し、以前の子ストップウォッチ(またはタイムインスツルメント)を停止します。

を呼び出す start() の方法 Profiler 作成する子ストップウォッチの名前を表す文字列値を渡すことによってクラス。

//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();

これらのストップウォッチを作成した後、タスクを実行するか、タスクを実行するメソッドを呼び出すことができます。

ステップ3:別の子ストップウォッチを開始します(必要な場合)

必要に応じて、を使用して別のストップウォッチを作成します start()メソッドを実行し、必要なタスクを実行します。これを行うと、新しいストップウォッチが開始され、前のストップウォッチが停止します(つまり、タスク1)。

//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();

ステップ4:時計を停止します

を呼び出すと stop() メソッドでは、最近の子ストップウォッチとグローバルストップウォッチを停止し、現在のタイムインストルメントを返します。

// Stopping the current child stopwatch and the global stopwatch.
TimeInstrument tm = profiler.stop();

ステップ5:タイムインスツルメントの内容を印刷します。

を使用して現在の時刻計の内容を印刷します print() 方法。

//printing the contents of the time instrument
tm.print();

次の例は、SLF4Jのプロファイラークラスを使用したプロファイリングを示しています。ここでは、1から10000までの数値の二乗和を出力し、1から10000までの数値の合計を出力する、2つのサンプルタスクを実行しました。これら2つのタスクにかかる時間を取得しようとしています。

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();
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

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.

プロファイラー情報のログ

この情報をログに記録するためにプロファイラーの結果を印刷する代わりに、次のことを行う必要があります。

  • を使用してロガーを作成します LoggerFactory クラス。

  • プロファイラークラスをインスタンス化してプロファイラーを作成します。

  • 作成されたロガーオブジェクトをに渡すことにより、ロガーをプロファイラーに関連付けます setLogger() の方法 Profiler クラス。

  • 最後に、ログを印刷する代わりに、プロファイラーの情報を使用して log() 方法。

次の例では、(印刷する代わりに)前の例とは異なり、タイムインスツルメントの内容をログに記録しようとしています。

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();
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000