0Pricing
Java Academy · บทเรียน

การอุ่นเครื่องและรอบการทำงาน

วัดประสิทธิภาพในสภาวะคงที่

การอุ่นเครื่องและรอบการทำงาน เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

การอุ่นเครื่องและรอบการทำงาน

JMH วัดประสิทธิภาพในสภาวะคงตัว: ความเร็วที่โค้ดทำได้หลังจาก JVM ปรับโค้ดให้เหมาะสมอย่างสมบูรณ์แล้ว เพื่อให้ได้เช่นนั้น JMH จะเรียกใช้รอบการอุ่นเครื่องที่ไม่นำผลลัพธ์ไปใช้ก่อน จากนั้นจึงเรียกใช้รอบการวัดผลจริง บทเรียนนี้ครอบคลุมการปรับค่าทั้งสองส่วน

เหตุใดจึงต้องอุ่นเครื่อง

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

@Warmup

@Warmup ควบคุมช่วงที่ไม่นำผลลัพธ์ไปใช้ ได้แก่ จำนวนรอบการทำงานและระยะเวลาที่แต่ละรอบทำงาน

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

@Measurement

@Measurement ควบคุมช่วงการทำงานจริงที่มีการบันทึกผล ยิ่งมีรอบการทำงานมาก ช่วงความเชื่อมั่นก็ยิ่งแคบลง แต่การเรียกใช้ก็ใช้เวลานานขึ้น

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

รอบการทำงานกับการดำเนินการ

โปรดระวังคำศัพท์ รอบการทำงานคือช่วงเวลาที่จับเวลา เช่น หนึ่งวินาที ภายในแต่ละช่วง JMH จะเรียกใช้เมธอด Benchmark ให้ได้มากที่สุดเท่าที่ทำได้ โดยการเรียกใช้แต่ละครั้งคือการดำเนินการ คะแนนจะรายงานต่อการดำเนินการ

ต้องอุ่นเครื่องกี่รอบจึงจะเพียงพอ

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

การแยกกระบวนการเพิ่มการอุ่นเครื่อง

การแยกกระบวนการแต่ละครั้งใช้ JVM ใหม่ทั้งหมด ดังนั้นแต่ละกระบวนการจึงต้องอุ่นเครื่องเต็มรูปแบบซ้ำอีกครั้ง การใช้หลายกระบวนการช่วยทั้งแยกข้อมูลประวัติของคอมไพเลอร์แบบทันเวลา และแสดงความแปรผันระหว่าง JVM ซึ่งเป็นวิธีวัดความเสถียรที่ตรงไปตรงมาที่สุด

import org.openjdk.jmh.annotations.*;

@Fork(3)
@Warmup(iterations = 5)
@Measurement(iterations = 10)
public class Bench {
    @Benchmark
    public double sqrt() {
        return Math.sqrt(2.0);
    }
}

การสาธิตผลลัพธ์

ลูป Java ธรรมดานี้จะแสดงเวลาของแต่ละชุด คุณมักจะเห็นว่าชุดแรก ๆ ทำงานช้ากว่าชุดหลัง ๆ ขณะที่คอมไพเลอร์แบบทันเวลาคอมไพล์เมธอด ซึ่งเป็นผลของการอุ่นเครื่องที่ JMH ไม่นำไปใช้พอดี

public class Main {
    static long busy(int n) {
        long s = 0;
        for (int i = 0; i < n; i++) s += (long) Math.sqrt(i);
        return s;
    }
    public static void main(String[] args) {
        for (int batch = 0; batch < 5; batch++) {
            long t = System.nanoTime();
            long r = busy(2_000_000);
            System.out.println("batch " + batch + ": "
                + (System.nanoTime() - t) / 1000 + " us, r=" + r);
        }
    }
}

แบบอิงเวลาเทียบกับแบบอิงจำนวน

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

อย่าปรับแต่งมากเกินไป

การเรียกใช้เป็นเวลานานมากใช้เวลาเพิ่มขึ้น แต่ไม่ได้ช่วยเพิ่มความแม่นยำมากนักเมื่อเข้าสู่สภาวะคงตัวแล้ว ควรมุ่งให้ได้ตัวเลขที่เสถียรและทำซ้ำได้ในทุกกระบวนการ แทนการเพิ่มจำนวนรอบการทำงานให้สูงที่สุด ความสามารถในการทำซ้ำสำคัญกว่าตัวเลขเดี่ยวที่ดูน่าประทับใจ

การอ่านการเข้าสู่สภาวะคงตัว

JMH จะแสดงคะแนนของแต่ละรอบระหว่างการทำงาน Benchmark ที่ดีควรแสดงให้เห็นว่ารอบการอุ่นเครื่องค่อย ๆ เข้าใกล้ค่าคงที่ และรอบการวัดผลรวมกลุ่มกันแน่นรอบคะแนนสุดท้าย โดยมีค่าความคลาดเคลื่อน +/- น้อย

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับการอุ่นเครื่องและรอบการทำงาน

สรุปทบทวน

คุณได้เรียนรู้วิธีวัดประสิทธิภาพในสภาวะคงตัว:

  • @Warmup เรียกใช้รอบการทำงานที่ไม่นำผลลัพธ์ไปใช้ เพื่อให้คอมไพเลอร์แบบทันเวลาคอมไพล์โค้ด
  • @Measurement เรียกใช้รอบการทำงานที่บันทึกผล ยิ่งมีมากก็ยิ่งลดช่วงความคลาดเคลื่อน
  • รอบการทำงานคือช่วงเวลาที่จับเวลา ส่วนการเรียกใช้แต่ละครั้งภายในรอบคือการดำเนินการ
  • การใช้ @Fork หลายครั้งจะทำซ้ำการอุ่นเครื่องใน JVM ใหม่ และแสดงความแปรผันระหว่าง JVM
  • มุ่งให้ได้คะแนนที่ทำซ้ำได้และเสถียร แทนการเพิ่มระยะเวลาการทำงานให้มากที่สุด

คำถามที่พบบ่อย

บทเรียน “การอุ่นเครื่องและรอบการทำงาน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอุ่นเครื่องและรอบการทำงาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การอุ่นเครื่องและรอบการทำงาน”

วัดประสิทธิภาพในสภาวะคงที่ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การอุ่นเครื่องและรอบการทำงาน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุใดจึงใช้ JMH
  2. การเขียนการวัดประสิทธิภาพ
  3. การอุ่นเครื่องและรอบการทำงาน
  4. การหลีกเลี่ยงการลบโค้ดที่ไม่ก่อผล
← กลับไปที่ Java Academy