การอุ่นเครื่องและรอบการทำงาน
วัดประสิทธิภาพในสภาวะคงที่
การอุ่นเครื่องและรอบการทำงาน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดจึงใช้ JMH
- การเขียนการวัดประสิทธิภาพ
- การอุ่นเครื่องและรอบการทำงาน
- การหลีกเลี่ยงการลบโค้ดที่ไม่ก่อผล