SLF4J - การทำโปรไฟล์

SLF4J Distribution ให้ slf4j-ext.jar สิ่งนี้มี API สำหรับฟังก์ชันต่างๆเช่นการทำโปรไฟล์การบันทึกแบบขยายการบันทึกเหตุการณ์และการบันทึกด้วยตัวแทน java

การทำโปรไฟล์

บางครั้งโปรแกรมเมอร์ต้องการวัดคุณลักษณะบางอย่างเช่นการใช้หน่วยความจำความซับซ้อนของเวลาหรือการใช้คำสั่งเฉพาะเกี่ยวกับโปรแกรมเพื่อวัดความสามารถที่แท้จริงของโปรแกรมนั้น การวัดผลเกี่ยวกับโปรแกรมดังกล่าวเรียกว่าการทำโปรไฟล์ การทำโปรไฟล์ใช้การวิเคราะห์โปรแกรมแบบไดนามิกเพื่อทำการวัดดังกล่าว

SLF4J จัดเตรียมคลาสที่ชื่อ Profiler ใน org.slf4j.profilerแพ็คเกจสำหรับการทำโปรไฟล์ นี่เรียกว่าโปรไฟล์ของชายผู้น่าสงสาร เมื่อใช้สิ่งนี้โปรแกรมเมอร์สามารถค้นหาเวลาที่ต้องใช้ในการทำงานที่ยืดเยื้อ

การทำโปรไฟล์โดยใช้คลาส Profiler

ผู้สร้างโปรไฟล์ประกอบด้วยนาฬิกาจับเวลาและนาฬิกาจับเวลาเด็กและเราสามารถเริ่มและหยุดสิ่งเหล่านี้ได้โดยใช้วิธีการที่จัดเตรียมโดยคลาส profiler

หากต้องการดำเนินการสร้างโปรไฟล์โดยใช้คลาส profiler ให้ทำตามขั้นตอนด้านล่าง

ขั้นตอนที่ 1 - สร้างอินสแตนซ์คลาส profiler

สร้างอินสแตนซ์คลาส Profiler โดยส่งผ่านค่า String ที่แสดงชื่อของ profiler เมื่อเราสร้างอินสแตนซ์คลาส Profiler นาฬิกาจับเวลาทั่วโลกจะเริ่มทำงาน

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

ขั้นตอนที่ 2 - เริ่มนาฬิกาจับเวลาเด็ก

เมื่อเราเรียกใช้ start() วิธีนี้จะเริ่มนาฬิกาจับเวลาเด็กใหม่ (ตั้งชื่อ) และหยุดนาฬิกาจับเวลาเด็กรุ่นก่อนหน้านี้ (หรือเครื่องมือบอกเวลา)

เรียกใช้ไฟล์ start() วิธีการของ Profiler คลาสโดยส่งผ่านค่า String ที่แสดงชื่อของนาฬิกาจับเวลาลูกที่จะสร้าง

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

ตัวอย่าง

ตัวอย่างต่อไปนี้สาธิตการทำโปรไฟล์โดยใช้คลาส Profiler ของ SLF4J ที่นี่เราได้ดำเนินการตัวอย่างสองงานพิมพ์ผลรวมของกำลังสองของตัวเลขตั้งแต่ 1 ถึง 10,000 พิมพ์ผลรวมของตัวเลขตั้งแต่ 1 ถึง 10,000 เราพยายามหาเวลาที่ใช้สำหรับสองงานนี้

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.

การบันทึกข้อมูล Profiler

แทนที่จะพิมพ์ผลลัพธ์ของผู้สร้างโปรไฟล์เพื่อบันทึกข้อมูลนี้คุณต้อง -

  • สร้างคนตัดไม้โดยใช้ไฟล์ LoggerFactory ชั้นเรียน

  • สร้าง profiler โดยสร้างอินสแตนซ์คลาส Profiler

  • เชื่อมโยงคนตัดไม้กับ profiler โดยส่งวัตถุคนตัดไม้ที่สร้างไปยังไฟล์ 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