มีเหตุผลด้านประสิทธิภาพในการประกาศพารามิเตอร์เมธอดใน Java หรือไม่?
ใน:
public void foo(int bar) { ... }
เมื่อเทียบกับ:
public void foo(final int bar) { ... }
สมมติว่ามีการอ่านอย่างเดียวและไม่เคยแก้ไขได้ในbar
foo()
มีเหตุผลด้านประสิทธิภาพในการประกาศพารามิเตอร์เมธอดใน Java หรือไม่?
ใน:
public void foo(int bar) { ... }
เมื่อเทียบกับ:
public void foo(final int bar) { ... }
สมมติว่ามีการอ่านอย่างเดียวและไม่เคยแก้ไขได้ในbar
foo()
คำตอบ:
คีย์เวิร์ดสุดท้ายไม่ปรากฏในไฟล์คลาสสำหรับตัวแปรและพารามิเตอร์โลคัลดังนั้นจึงไม่ส่งผลกระทบต่อประสิทธิภาพรันไทม์ การใช้งานเพียงเพื่อชี้แจงเจตนาของผู้เขียนโค้ดว่าตัวแปรจะไม่ถูกเปลี่ยนแปลง (ซึ่งหลายคนคิดว่ามีเหตุผลที่น่าสงสัยสำหรับการใช้งาน) และจัดการกับคลาสภายในที่ไม่ระบุตัวตน
มีข้อโต้แย้งมากมายว่าตัวปรับแต่งขั้นสุดท้ายของเมธอดนั้นมีประสิทธิภาพที่เพิ่มขึ้นหรือไม่เนื่องจากเมธอดจะถูกอินไลน์โดยคอมไพลเลอร์ที่ปรับให้เหมาะสมในรันไทม์โดยไม่คำนึงถึงตัวปรับแต่ง ในกรณีนี้ควรใช้เพื่อ จำกัด การลบล้างเมธอดเท่านั้น
ประโยชน์เพียงอย่างเดียวของพารามิเตอร์สุดท้ายคือสามารถใช้ในคลาสที่ซ้อนกันแบบไม่ระบุชื่อ หากไม่มีการเปลี่ยนแปลงพารามิเตอร์คอมไพลเลอร์จะตรวจพบว่าเป็นส่วนหนึ่งของการทำงานปกติแม้ว่าจะไม่มีตัวปรับแต่งขั้นสุดท้ายก็ตาม ค่อนข้างหายากที่ข้อบกพร่องเกิดจากการกำหนดพารามิเตอร์โดยไม่คาดคิด - หากวิธีการของคุณใหญ่พอที่จะต้องใช้วิศวกรรมระดับนี้ทำให้มีขนาดเล็กลง - วิธีการที่คุณเรียกไม่สามารถเปลี่ยนพารามิเตอร์ของคุณได้
คอมไพเลอร์ที่ทำงานหลังการโหลดคลาสเช่นคอมไพเลอร์ JIT สามารถใช้ประโยชน์จากวิธีสุดท้าย ดังนั้นวิธีการที่ประกาศขั้นสุดท้ายอาจมีประโยชน์ด้านประสิทธิภาพ
http://www.javaperformancetuning.com/tips/final.shtml
โอ้และอีกหนึ่งแหล่งข้อมูลที่ดี
อีกหนึ่งประเด็นที่กล่าวไปข้างต้นว่าการใช้ตัวแปรโลคัลที่ไม่ใช่ขั้นสุดท้ายที่ประกาศภายในเมธอดอินสแตนซ์คลาสภายในอาจอยู่ได้นานกว่าสแต็กเฟรมดังนั้นตัวแปรโลคัลอาจหายไปในขณะที่วัตถุภายในยังมีชีวิตอยู่
ฉันคิดว่าคอมไพเลอร์สามารถลบตัวแปรสุดท้ายแบบคงที่ส่วนตัวทั้งหมดที่มีประเภทดั้งเดิมเช่น int และอินไลน์โดยตรงในโค้ดเช่นเดียวกับมาโคร C ++
อย่างไรก็ตามฉันไม่มีเงื่อนงำหากสิ่งนี้ทำได้ในทางปฏิบัติ แต่สามารถทำได้เพื่อบันทึกหน่วยความจำบางส่วน