ฟังก์ชัน inline: ลดต้นทุนของ Lambda
กำหนดฟังก์ชันเป็น inline เพื่อหลีกเลี่ยงการสร้างออบเจ็กต์สำหรับพารามิเตอร์ lambda
ฟังก์ชัน inline: ลดต้นทุนของ Lambda เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชัน inline คืออะไร
โดยปกติ แลมบ์ดาที่ส่งให้ฟังก์ชันจะถูกคอมไพล์เป็นคลาสนิรนาม การเรียกใช้แต่ละครั้งจะจัดสรรออบเจ็กต์ใหม่ ซึ่งใช้ทั้งหน่วยความจำและเวลา คีย์เวิร์ด inline จะบอกคอมไพเลอร์ให้ คัดลอกตัวฟังก์ชัน (รวมถึงอาร์กิวเมนต์แลมบ์ดา) ไปไว้ในจุดที่เรียกใช้โดยตรง
การประกาศ inline
เพิ่มตัวปรับแต่ง inline ไว้หน้า fun:
inline fun measureTime(block: () -> Unit): Long {
val start = System.nanoTime()
block()
return System.nanoTime() - start
}วิธีที่คอมไพเลอร์เขียนการเรียกใช้ใหม่
การเรียกใช้เช่น measureTime { doWork() } จะกลายเป็นตัวฟังก์ชันของ measureTime ที่ถูกแทรกไว้ในระดับไบต์โค้ด จึงไม่เคยมีการจัดสรรออบเจ็กต์แลมบ์ดา
เมื่อใดควรใช้ inline
ใช้ inline เมื่อ:
- ฟังก์ชันรับพารามิเตอร์แลมบ์ดาอย่างน้อยหนึ่งตัว
- ฟังก์ชันถูกเรียกใช้บ่อยในเส้นทางการทำงานที่มีการเรียกซ้ำมาก (ลูปกระชับหรือฟังก์ชันประกอบส่วนติดต่อผู้ใช้)
- คุณต้องใช้พารามิเตอร์ชนิด
reified(จะกล่าวถึงในหัวข้อถัดไป)
ตัวอย่างการวัดประสิทธิภาพ
หากไม่ใช้ inline การเรียกใช้ฟังก์ชันลำดับสูงแต่ละครั้งจะจัดสรรออบเจ็กต์แลมบ์ดา แต่เมื่อใช้แล้ว JVM จะเห็นโค้ดที่ทำงานต่อเนื่องโดยตรง ไม่มีการจัดสรรออบเจ็กต์และไม่มีการเรียกใช้แบบไดนามิก
inline fun repeat(n: Int, block: () -> Unit) {
for (i in 0 until n) block()
}การคืนค่าข้ามขอบเขต
ประโยชน์สำคัญของฟังก์ชัน inline คือ แลมบ์ดาสามารถใช้ return เพื่อออกจากฟังก์ชัน ที่ครอบอยู่ ไม่ใช่เพียงออกจากแลมบ์ดาเท่านั้น การทำเช่นนี้เรียกว่า การคืนค่าข้ามขอบเขต
inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
for (item in list) block(item)
}
fun findFirst(list: List<Int>): Int {
forEach(list) { if (it > 5) return it } // returns from findFirst
return -1
}ข้อจำกัดของ inline
ไม่สามารถเก็บฟังก์ชัน inline ไว้ในตัวแปรหรือส่งต่อเป็นออบเจ็กต์ได้ เนื่องจากฟังก์ชันเหล่านี้ไม่มีอยู่เป็นเอนทิตีระดับแรกในขณะทำงาน คุณไม่สามารถเรียก f(::measureTime) เมื่อ f ต้องการการอ้างอิงฟังก์ชันที่มีลายเซ็นดังกล่าว
การแทรกโค้ดในสายการประมวลผลของคอลเลกชัน
ฟังก์ชันในไลบรารีมาตรฐานอย่าง map, filter, forEach และอื่น ๆ ล้วนเป็น inline นี่จึงเป็นเหตุผลว่าทำไมการเชื่อมฟังก์ชันเหล่านี้จึงไม่สร้างออบเจ็กต์คลosure เพิ่มสำหรับแต่ละสมาชิก
val result = (1..1_000_000)
.filter { it % 2 == 0 } // inline
.map { it * it } // inline
.take(10)ข้อแลกเปลี่ยนด้านขนาดโค้ด
แต่ละจุดที่เรียกใช้จะได้รับสำเนาของโค้ดที่ถูกแทรก หากตัวฟังก์ชันมีขนาดใหญ่และถูกเรียกจากหลายตำแหน่ง ขนาดไบต์โค้ดจะเพิ่มขึ้น ควรใช้ inline กับแลมบ์ดาขนาดเล็กที่ถูกเรียกใช้บ่อย
การทำงานร่วมกับ companion และระดับบนสุด
inline ใช้ได้กับฟังก์ชันระดับบนสุดและฟังก์ชันสมาชิก แต่ใช้กับพร็อพเพอร์ตี้หรือตัวสร้างไม่ได้ ฟังก์ชันต้องมองเห็นได้จากจุดที่เรียกใช้ (โดยปกติคือ public หรือ internal)
ตัวอย่างจากไลบรารีมาตรฐาน
ฟังก์ชันที่คุณคุ้นเคยและเป็น inline ได้แก่ let, run, apply, also, with, use, synchronized และ lazy (รูปแบบที่รับบล็อก) ตัวปรับแต่ง inline ทำให้แลมบ์ดาของฟังก์ชันเหล่านี้ไม่มีต้นทุนเพิ่มเติม
ตรวจสอบอย่างรวดเร็ว
ประโยชน์หลักของการกำหนดให้ฟังก์ชันลำดับสูงเป็น inline คืออะไร
ทบทวน: ฟังก์ชัน inline
ประเด็นสำคัญ:
inlineช่วยกำจัดการจัดสรรออบเจ็กต์แลมบ์ดา- ทำให้สามารถคืนค่าข้ามขอบเขตจากแลมบ์ดาได้
- จำเป็นสำหรับพารามิเตอร์ชนิด
reified - เหมาะที่สุดสำหรับฟังก์ชันลำดับสูงขนาดเล็กที่ถูกเรียกใช้บ่อย
- ฟังก์ชันกำหนดขอบเขตในไลบรารีมาตรฐานล้วนเป็น
inline
คำถามที่พบบ่อย
บทเรียน “ฟังก์ชัน inline: ลดต้นทุนของ Lambda” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ฟังก์ชัน inline: ลดต้นทุนของ Lambda” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชัน inline: ลดต้นทุนของ Lambda”
กำหนดฟังก์ชันเป็น inline เพื่อหลีกเลี่ยงการสร้างออบเจ็กต์สำหรับพารามิเตอร์ lambda คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ฟังก์ชัน inline: ลดต้นทุนของ Lambda” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชัน inline: ลดต้นทุนของ Lambda
- ตัวปรับแต่ง noinline และ crossinline
- พารามิเตอร์ชนิด reified: เข้าถึง T ขณะรันไทม์
- รูปแบบ reified เชิงปฏิบัติ: การแยกวิเคราะห์ DI และการทำซีเรียลไลซ์