ฉันรู้ว่า 'การข้ามเขตแดน' เมื่อทำการโทร JNI ใน Java ช้า
อย่างไรก็ตามฉันอยากรู้ว่าอะไรทำให้ช้าลง? การนำ jvm ไปปฏิบัติใช้ทำอะไรเมื่อทำการโทร JNI ที่ทำให้ช้ามาก?
ฉันรู้ว่า 'การข้ามเขตแดน' เมื่อทำการโทร JNI ใน Java ช้า
อย่างไรก็ตามฉันอยากรู้ว่าอะไรทำให้ช้าลง? การนำ jvm ไปปฏิบัติใช้ทำอะไรเมื่อทำการโทร JNI ที่ทำให้ช้ามาก?
คำตอบ:
อันดับแรกมันน่าสังเกตว่า "ช้า" เรากำลังพูดถึงบางสิ่งบางอย่างที่อาจใช้เวลาหลายสิบวินาที สำหรับวิธีเนทีฟเล็กน้อยในปี 2010 ฉันวัดการโทรเฉลี่ย 40 ns บนเดสก์ท็อป Windows ของฉันและ 11 ns บนเดสก์ท็อป Mac ของฉัน หากคุณไม่ได้โทรออกหลายสายคุณจะไม่สังเกตเห็น
ที่กล่าวว่าการเรียกใช้เมธอดเนทีฟอาจช้ากว่าการเรียกเมธอด Java ปกติ สาเหตุประกอบด้วย:
บางการสนทนาเพิ่มเติมอาจลงวันที่สามารถพบได้ใน "ประสิทธิภาพแพลตฟอร์มJava¿: กลยุทธ์และกลยุทธ์", 2000, โดย Steve Wilson และ Jeff Kesselman ในหัวข้อ "9.2: การตรวจสอบค่าใช้จ่าย JNI" ประมาณหนึ่งในสามของวิธีลงหน้านี้ให้ไว้ในความคิดเห็นโดย @Philip ด้านล่าง
IBM developerWorks ในกระดาษ 2009 "แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Java Native Interface"ให้คำแนะนำเกี่ยวกับการหลีกเลี่ยงข้อผิดพลาดด้านประสิทธิภาพด้วย JNI
sun.misc.Unsafe
และสิ่งอื่น ๆ อีกมากมายเช่นSystem.currentTimeMillis/nanoTime
ได้รับการจัดการผ่าน 'เวทมนตร์' โดย JVM พวกเขาไม่ใช่ JNI และพวกเขาไม่มีไฟล์. c / .h ที่เหมาะสมการถอด JVM impl เอง ไม่สามารถทำตามวิธีการได้เว้นแต่คุณจะเขียน / เจาะระบบ JVM
เป็นมูลค่าการกล่าวขวัญว่าไม่ใช่ทุกวิธี Java ทำเครื่องหมายด้วย native
"ช้า" บางส่วนของพวกเขาภายในที่ทำให้พวกเขาเร็วมาก หากต้องการตรวจสอบว่าคนที่มีที่แท้จริงและคนที่ไม่ได้คุณสามารถมองหาdo_intrinsic
ที่vmSymbols.hpp
โดยพื้นฐานแล้ว JVM จะสร้างพารามิเตอร์ C สำหรับการโทร JNI แต่ละครั้งและรหัสนั้นไม่ได้รับการปรับให้เหมาะสม
มีรายละเอียดเพิ่มเติมมากมายที่ระบุไว้ในบทความนี้
หากคุณสนใจในการเปรียบเทียบ JNI กับ native code โปรเจคนี้มีรหัสสำหรับการรัน benchmark