คอมไพเลอร์ just-in-time (JIT) ทำอะไร


528

คอมไพเลอร์ JIT ทำอะไรเป็นพิเศษเมื่อเทียบกับคอมไพเลอร์ที่ไม่ใช่ของ JIT ใครสามารถให้คำอธิบายสั้น ๆ และเข้าใจง่าย




2
ฉันพบyoutube.com/watch?v=yQ27DjKnxwoว่าเป็นประโยชน์
— Adam Zerner

คำตอบ:


518

คอมไพเลอร์ JIT ทำงานหลังจากที่โปรแกรมเริ่มต้นและรวบรวมรหัส (โดยปกติคือ bytecode หรือคำสั่ง VM บางชนิด) ได้ทันที ชุดคำสั่ง JIT มีการเข้าถึงข้อมูลรันไทม์แบบไดนามิกในขณะที่คอมไพเลอร์มาตรฐานไม่สามารถและเพิ่มประสิทธิภาพที่ดีขึ้นเช่นฟังก์ชั่นอินไลน์ที่ใช้บ่อย

นี่ตรงกันข้ามกับคอมไพเลอร์ดั้งเดิมที่รวบรวมรหัสทั้งหมดเป็นภาษาเครื่องก่อนที่โปรแกรมจะทำงานครั้งแรก

ในการถอดความคอมไพเลอร์ทั่วไปจะสร้างโปรแกรมทั้งหมดเป็นไฟล์ EXE ก่อนที่คุณจะรันครั้งแรก สำหรับโปรแกรมสไตล์ที่ใหม่กว่าแอสเซมบลีจะถูกสร้างขึ้นด้วย pseudocode (รหัส p) เฉพาะหลังจากที่คุณรันโปรแกรมบนระบบปฏิบัติการ (เช่นโดยการดับเบิลคลิกที่ไอคอน) คอมไพเลอร์ (JIT) จะเตะและสร้างรหัสเครื่อง (m-code) ที่โปรเซสเซอร์ที่ใช้ Intel หรืออะไรก็ตามที่จะเข้าใจ


16
และในทางตรงกันข้ามกับรหัสที่แปลความหมายซึ่งเริ่มต้นใช้งานคำสั่ง bytecode หรือ VM ทันทีโดยไม่ชักช้า แต่จะเรียกใช้คำสั่งช้ากว่าภาษาเครื่อง
— แอรอน

3
JIT มักใช้กับโค้ดที่แปลเพื่อแปลงเป็นภาษาเครื่อง แต่ใช่โค้ดที่แปลอย่างหมดจด (โดยไม่มี JITting) ช้า แม้แต่ Java bytecode ที่ไม่มี JITter ก็ช้ามาก
— Mark Cidade

48
เป้าหมายไม่จำเป็นต้องเป็นรหัสเครื่อง JRuby มีคอมไพเลอร์ JIT ซึ่งจะรวบรวมซอร์สโค้ด Ruby ไปยัง Java bytecode หลังจากการเรียกใช้สองสามครั้ง จากนั้นหลังจากการเรียกใช้อีกสองสามครั้งคอมไพเลอร์ JVM JIT เตะและคอมไพล์ bytecode เป็นโค้ดเนทีฟ
— Jörg W Mittag

4
เป็นที่น่าสังเกตว่าตามที่Jörgพูดถึง JIT ไม่จำเป็นต้องเรียกใช้ทันที บ่อยครั้งที่รหัสจะถูกตีความจนกว่าจะมีการพิจารณาว่าจะมีค่า JITting เนื่องจาก JITting สามารถแนะนำความล่าช้าจึงอาจไม่เร็วกว่าที่จะไม่ใช้ JIT บางรหัสหากใช้น้อยและการตอบสนองที่รวดเร็วจึงมีความสำคัญมากกว่ารันไทม์โดยรวม
— Adam Jaskiewicz

3
@ErikReppen: หากเครื่องใหม่ออกมาการคอมไพล์และปรับโปรแกรมให้เหมาะสมสำหรับเครื่องใหม่ที่ใช้คอมไพเลอร์ทั่วไปน่าจะให้ผลลัพธ์ได้เร็วกว่า JIT บนมืออื่น ๆ , JIT ที่เหมาะสำหรับการที่เครื่องใหม่จะสามารถที่จะสามารถเพิ่มประสิทธิภาพการทำงานของรหัสที่ถูกตีพิมพ์ก่อนที่เครื่องใหม่ถูกคิดค้น
— supercat

255

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

จนถึงจุดหนึ่งในการวิวัฒนาการของภาษาคอมไพเลอร์จะรวบรวมภาษาระดับสูงเป็นรหัสหลอกซึ่งจะถูกตีความ (โดยล่าม) เพื่อเรียกใช้โปรแกรมของคุณ สิ่งนี้จะกำจัดรหัสวัตถุและไฟล์ปฏิบัติการและทำให้ภาษาเหล่านี้สามารถพกพาไปยังระบบปฏิบัติการหลายระบบและแพลตฟอร์มฮาร์ดแวร์ได้ Pascal (ซึ่งรวบรวมไปยัง P-Code) เป็นหนึ่งในคนแรก Java และ C # เป็นตัวอย่างล่าสุด ในที่สุดคำ P-Code ก็ถูกแทนที่ด้วย bytecode เนื่องจากการดำเนินการหลอกส่วนใหญ่นั้นยาวไบต์

คอมไพเลอร์ Just-In-Time (JIT) เป็นคุณลักษณะของล่ามรันไทม์ซึ่งแทนที่จะตีความ bytecode ทุกครั้งที่มีการเรียกใช้เมธอดจะรวบรวม bytecode ลงในคำแนะนำรหัสเครื่องของเครื่องที่ทำงานแล้วเรียกสิ่งนี้ รหัสวัตถุแทน ในทางกลับกันประสิทธิภาพของการรันออบเจ็กต์โค้ดจะเอาชนะความไม่มีประสิทธิภาพในการคอมไพล์โปรแกรมใหม่ทุกครั้งที่รัน


5
อย่างไรก็ตามวลีนี้"คอมไพเลอร์ Just-In-Time (JIT) เป็นคุณลักษณะของตัวแปลเวลาทำงาน"ทำให้เกิดความสับสน เช่น - stackoverflow.com/questions/16439512/…
— Stephen C

11
ที่จริงแล้ว JIT เป็นส่วนเสริมและคุณยังสามารถปิดใช้งานได้โดยใช้พารามิเตอร์ -Xint กับ Java ดังนั้นจึงเป็นเพียงคุณสมบัติ
— Craig Trader

3
ฉันไม่เห็นด้วยอย่างเต็มที่ JIT ไม่ใช่วิวัฒนาการ - มันเป็นทางเลือกของคอมไพเลอร์คลาสสิค
— i486

1
JIT เป็นขั้นตอนเดียวในเส้นทางวิวัฒนาการจากสวิตช์เชิงกลแบบเดินสายยากไปจนถึงการระบุเกณฑ์การค้นหาโดยพูดว่า "OK Google" กับสมาร์ทโฟนของคุณ JIT ที่มีอยู่ในปัจจุบันเป็นส่วนหนึ่งของ Java 7/8 คือการก้าวกระโดดเกินขอบเขตที่มีอยู่ใน Java 2 ซึ่งเป็นวิวัฒนาการเช่นกัน
— Craig Trader

1
@ i486 - Sun / Oracle มี (AFAIK) ไม่เคยส่งคอมไพเลอร์แบบคลาสสิก ("ก่อนเวลา") สำหรับ Java ที่สร้างรหัสเนทิฟ มันเป็นการยืดเวลาให้เหตุผลว่า JIT เป็นทางเลือก ... เมื่อสิ่งที่พวกเขาคาดว่าจะเป็นทางเลือกสำหรับก็ไม่เคยส่ง (ฉันลดคอมไพเลอร์ GCJ AOT เนื่องจากไม่มีส่วนเกี่ยวข้องกับ Sun / Oracle และไม่ใช่โซลูชันที่สมบูรณ์เช่นกันตอนนี้ไม่สามารถใช้งานได้)
— Stephen C

69

JIT- ทันเวลาคำพูดของตัวเองบอกว่าเมื่อมันจำเป็น (ตามความต้องการ)

สถานการณ์ทั่วไป:

รหัสที่มาจะถูกแปลงเป็นรหัสเครื่องอย่างสมบูรณ์

สถานการณ์ JIT:

ซอร์สโค้ดจะถูกแปลงเป็นภาษาแอสเซมบลีเช่นโครงสร้าง [สำหรับ ex IL (ภาษากลาง) สำหรับ C #, ByteCode สำหรับ java]

รหัสกลางจะถูกแปลงเป็นภาษาเครื่องเฉพาะเมื่อแอปพลิเคชันต้องการรหัสที่จำเป็นเท่านั้นที่จะถูกแปลงเป็นรหัสเครื่องเท่านั้น

JIT กับการเปรียบเทียบที่ไม่ใช่ของ JIT:

  • ใน JIT ไม่ใช่รหัสทั้งหมดจะถูกแปลงเป็นรหัสเครื่องก่อนส่วนหนึ่งของรหัสที่จำเป็นจะถูกแปลงเป็นรหัสเครื่องแล้วหากวิธีการหรือฟังก์ชันการทำงานที่เรียกว่าไม่ได้อยู่ในเครื่องแล้วจะกลายเป็นรหัสเครื่อง ... จะลดลง ภาระในซีพียู

  • เนื่องจากรหัสเครื่องจะถูกสร้างขึ้นในเวลาทำงาน .... คอมไพเลอร์ JIT จะผลิตรหัสเครื่องที่ปรับให้เหมาะสมสำหรับสถาปัตยกรรม CPU ของเครื่อง

ตัวอย่าง JIT:

  1. ใน Java JIT อยู่ใน JVM (Java Virtual Machine)
  2. ใน C # มันอยู่ใน CLR (Common Language Runtime)
  3. ใน Android นั้นอยู่ใน DVM (Dalvik Virtual Machine) หรือ ART (Android RunTime) ในเวอร์ชันที่ใหม่กว่า

7
JIT เสนอข้อได้เปรียบพิเศษในกรอบการทำงานด้วยการสนับสนุนชนิดทั่วไปจริง เป็นไปได้ที่จะกำหนดวิธีการทั่วไปซึ่งจะสามารถสร้างช่วงของประเภทที่ไม่ จำกัด แต่ละชนิดจะต้องมีรหัสเครื่องที่แตกต่างกัน แต่มีเพียง JIT สร้างรหัสสำหรับประเภทที่ผลิตจริง ในทางตรงกันข้ามใน C ++ มันจำเป็นที่คอมไพเลอร์จะสร้างโค้ดสำหรับทุกประเภทที่โปรแกรมจะใช้
— supercat

6
JVM ไม่ใช่รหัส JIT ในครั้งแรกที่เรียกใช้ สองสามครั้งแรกมันตีความ bytecode จากนั้นหากโค้ดนั้นทำงานบ่อยเพียงพออาจตัดสินใจรบกวน JITting
— ninjalj

1
คุณกำลังพูด JIT ใน Java เป็น JVM อย่างไรก็ตามเราได้เตรียมโค้ดที่คอมไพล์ให้กับ JVM แล้วใช่ไหม งั้นก็รวบรวมมันอีกครั้งคุณหมายถึงอะไร?
— Koray Tugay

@KorayTugay - เราให้บริการ Bytecodes เป็น JVM และ JVM จะแปลงส่วนหนึ่งของส่วนนั้นให้เป็นรหัสของเครื่องตามทรัพยากร demand.so
— Durai Amuthan.H

1
ใน Java JIT ไม่ใช่ JVM มันเป็นเพียงส่วนหนึ่งของมัน
— สุข

25

ดังที่คนอื่น ๆ ได้กล่าวถึง

JIT ย่อมาจาก Just-in-Time ซึ่งหมายความว่าโค้ดจะถูกรวบรวมเมื่อจำเป็นไม่ใช่ก่อนรันไทม์

เพียงเพื่อเพิ่มประเด็นการอภิปรายข้างต้น JVM ยังคงนับว่าเป็นเวลาเท่าไหร่ฟังก์ชั่นจะถูกดำเนินการ หากจำนวนนี้เกินขีด จำกัด ที่กำหนดไว้ล่วงหน้า JIT จะรวบรวมรหัสเป็นภาษาเครื่องซึ่งสามารถประมวลผลได้โดยตรงโดยโปรเซสเซอร์ (ซึ่งแตกต่างจากกรณีปกติที่ javac รวบรวมรหัสเป็น bytecode แล้วจาวา - ล่ามตีความบรรทัด bytecode นี้โดยสายแปลงเป็น รหัสเครื่องและดำเนินการ)

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


14

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

ป้อนคำอธิบายรูปภาพที่นี่

หากไม่มีคอมไพเลอร์ JIT ตัวแปล JVM จะแปลโค้ดไบต์ต่อบรรทัดเพื่อให้ปรากฏราวกับว่ามีการเรียกใช้แอปพลิเคชันดั้งเดิม

ป้อนคำอธิบายรูปภาพที่นี่

แหล่ง


1
การตีความ JIT ของฉันคือการทำหน้าที่เหมือนบันทึกช่วยจำซึ่งฟังก์ชั่นที่ใช้บ่อยคือ 'เก็บไว้' และค่าใช้จ่ายในการรวบรวมจาก java bytecode ถึงรหัส ISA ที่ขึ้นกับภาษาท้องถิ่นนั้นจะถูกข้าม ถ้านี่ถูกต้องทำไม java ไม่คอมไพล์รหัสพื้นเมืองอย่างสมบูรณ์ตั้งแต่เริ่มต้น? วิธีนี้จะลดการคอมไพล์รันไทม์และทำให้ java 'native' เป็นเครื่องได้หรือไม่
— Michael Choi

12

JIT ย่อมาจาก Just-in-Time ซึ่งหมายความว่าโค้ดจะถูกรวบรวมเมื่อจำเป็นไม่ใช่ก่อนรันไทม์

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


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

ข้อสังเกตที่ดี เป็นไปได้ที่จะทำเช่นนี้ แต่ไม่ว่าจะเป็นประโยชน์หรือไม่นั้นขึ้นอยู่กับแพลตฟอร์มและการใช้งานแอพ การเพิ่มประสิทธิภาพ JIT ไม่จำเป็นต้องเหมือนกับออฟไลน์หรือการปรับให้เหมาะสมก่อนเวลาดังนั้นผลประโยชน์อาจเป็น 'ไม่ใช่การ JITting' ซึ่งอาจหรืออาจช่วยได้ไม่มากนัก
— Brian Lyttle

9

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

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

คอมไพเลอร์ JIT ใช้งานได้เฉพาะในช่วงรันไทม์ดังนั้นเราจึงไม่มีเอาต์พุตไบนารีใด ๆ


2
รหัสทั้งหมดไม่ได้รวบรวมเมื่อโหลดลงใน JVM เนื่องจากมีข้อมูลเล็กน้อย (อ่าน: คำแนะนำ) เกี่ยวกับวิธีการรวบรวม โปรดทราบว่าประสิทธิภาพเป็นเป้าหมายสูงสุด JIT ค่อนข้างเลือก: การตรวจสอบและเลือกวิธีที่นิยมที่สุดสำหรับการเพิ่มประสิทธิภาพ และมันยังคงทำเช่นนี้ไปจนถึงระดับสูงสุดของการเพิ่มประสิทธิภาพสำหรับแต่ละวิธี
— Yaw Boakye

7

Just In Time Compiler (JIT):
มันรวบรวม java bytecode เป็นคำสั่งเครื่องของ CPU เฉพาะนั้น

ตัวอย่างเช่นถ้าเรามีคำสั่งวนรอบในรหัส java ของเรา:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

โค้ดลูปข้างต้นทำงาน 10 ครั้งหากค่าของ i เป็น 0

ไม่จำเป็นต้องคอมไพล์โค้ดไบต์เป็นเวลา 10 ครั้งซ้ำแล้วซ้ำอีกเพราะคำสั่งเดิมจะดำเนินการ 10 ครั้ง ในกรณีนั้นจำเป็นต้องรวบรวมรหัสนั้นเพียงครั้งเดียวและสามารถเปลี่ยนค่าตามจำนวนครั้งที่ต้องการ ดังนั้น Just In Time (JIT) คอมไพเลอร์ติดตามคำสั่งและวิธีการดังกล่าว (ดังที่ได้กล่าวไว้ก่อนหน้านี้) และรวบรวมรหัสไบต์ดังกล่าวเป็นรหัสเครื่องเพื่อประสิทธิภาพที่ดีขึ้น

อีกตัวอย่างที่คล้ายกันคือการค้นหารูปแบบโดยใช้ "นิพจน์ปกติ" ในรายการของสตริง / ประโยค

JIT Compiler ไม่ได้รวบรวมรหัสทั้งหมดไปยังรหัสเครื่อง มันรวบรวมรหัสที่มีรูปแบบที่คล้ายกันในเวลาทำงาน

ดูเอกสารของออราเคิลในหัวข้อทำความเข้าใจ JITเพื่ออ่านเพิ่มเติม


"ไม่จำเป็นต้องคอมไพล์โค้ดไบต์เป็นเวลา 10 ครั้งซ้ำแล้วซ้ำอีกเพราะคำสั่งเดิมจะดำเนินการ 10 ครั้ง" - คอมไพเลอร์ปกติจะเป็นอย่างไร? มันรวบรวมชิ้นส่วนนี้หลายครั้งหรือไม่?
— TT_

4

คุณมีรหัสที่บ่นเกี่ยวกับ IL (ภาษาระดับกลาง) เมื่อคุณเรียกใช้โปรแกรมคอมพิวเตอร์ไม่เข้าใจรหัสนี้ มันเข้าใจรหัสเนทีฟเท่านั้น ดังนั้นคอมไพเลอร์ JIT จะคอมไพล์ IL ของคุณเป็นโค้ดเนทีฟ มันเป็นเช่นนี้ในระดับวิธีการ


2
คุณหมายถึง "วิธีการระดับ"?
— Koray Tugay

4

ฉันรู้ว่านี่เป็นเธรดเก่า แต่การเพิ่มประสิทธิภาพรันไทม์เป็นอีกส่วนสำคัญของการรวบรวม JIT ที่ดูเหมือนจะไม่ได้กล่าวถึงที่นี่ โดยพื้นฐานแล้วคอมไพเลอร์ JIT สามารถมอนิเตอร์โปรแกรมในขณะที่มันรันเพื่อกำหนดวิธีในการปรับปรุงการดำเนินการ จากนั้นสามารถเปลี่ยนแปลงได้ทันที - ระหว่างรันไทม์ การเพิ่มประสิทธิภาพ Google JIT (javaworld มีบทความที่ดีเกี่ยวกับเรื่องนี้ )


3

Just in time compiler (JIT) เป็นซอฟต์แวร์ที่รับอินพุตที่ไม่สามารถเรียกทำงานได้และส่งคืนรหัสเครื่องที่เหมาะสมที่จะดำเนินการ ตัวอย่างเช่น:

Intermediate representation    JIT    Native machine code for the current CPU architecture

     Java bytecode            --->        machine code
     Javascript (run with V8) --->        machine code

ผลลัพธ์ของสิ่งนี้คือสำหรับสถาปัตยกรรม CPU บางตัวต้องติดตั้งคอมไพลเลอร์ JIT ที่เหมาะสม

คอมไพเลอร์, ล่ามและ JIT

แม้ว่าจะมีข้อยกเว้นโดยทั่วไปเมื่อเราต้องการแปลงรหัสต้นฉบับเป็นรหัสเครื่องที่เราสามารถใช้:

  1. คอมไพเลอร์ : รับซอร์สโค้ดและส่งคืนไฟล์ที่เรียกทำงานได้
  2. Interpreter : เรียกใช้งานคำสั่งโปรแกรมโดยคำสั่ง จะใช้ส่วนปฏิบัติการของรหัสที่มาและเปลี่ยนส่วนนั้นเป็นคำแนะนำเครื่อง กระบวนการนี้จะเกิดขึ้นซ้ำ ๆ จนกว่าซอร์สโค้ดทั้งหมดจะถูกแปลงเป็นคำสั่งเครื่องและดำเนินการ
  3. JIT : การใช้งานที่แตกต่างกันของ JIT เป็นไปได้ แต่ JIT มักจะเป็นการรวมกันของ compliler และล่าม JIT จะเปลี่ยนข้อมูลตัวกลางเป็นครั้งแรก (เช่น Java bytecode) ที่ได้รับเป็นภาษาเครื่องผ่านการตีความ JIT มักจะรู้สึกได้เมื่อมีการดำเนินการส่วนหนึ่งของรหัสบ่อยครั้งและจะรวบรวมส่วนนี้เพื่อการดำเนินการที่รวดเร็ว

2

Jit ย่อมาจากทันเวลาคอมไพเลอร์ jit เป็นโปรแกรมที่เปลี่ยนโค้ดจาวาไบต์เป็นคำสั่งที่สามารถส่งโดยตรงไปยังหน่วยประมวลผล

การใช้จาวาคอมไพเลอร์ทันเวลา (จริงๆคอมไพเลอร์ตัวที่สอง) ที่แพลตฟอร์มระบบโดยเฉพาะประมวลผล bytecode เป็นรหัสระบบเฉพาะเมื่อรหัสถูกคอมไพล์อีกครั้งโดย jit complier มันมักจะทำงานได้เร็วขึ้นในคอมพิวเตอร์

คอมไพเลอร์ทันเวลามาพร้อมกับเครื่องเสมือนจริงและใช้เป็นทางเลือก มันจะรวบรวม bytecode ลงในรหัสปฏิบัติการเฉพาะแพลตฟอร์มที่จะดำเนินการทันที


2

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

การรวบรวมไอทีเป็นการผสมผสานระหว่างสองวิธีการดั้งเดิมในการแปลเป็นรหัสเครื่อง - การรวบรวมล่วงหน้า (AOT)และการตีความ - และรวมข้อดีและข้อเสียของทั้งสองอย่างเข้าด้วยกัน รวบรวม JIT รวมความเร็วของการรวบรวมรหัสที่มีความยืดหยุ่นในการตีความ

ลองพิจารณา JIT ที่ใช้ใน JVM

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

เมื่อวิธีถูกเลือกสำหรับการรวบรวม JVM ฟีดไบต์ของมันไปยัง Just-In-Time คอมไพเลอร์ (JIT) JIT จำเป็นต้องเข้าใจความหมายและไวยากรณ์ของ bytecode ก่อนจึงจะสามารถรวบรวมวิธีการได้อย่างถูกต้อง เพื่อช่วยให้ผู้รวบรวม JIT วิเคราะห์วิธีนั้นไบต์แรก ๆ ของมันจะถูกจัดรูปแบบใหม่ในรูปแบบภายในที่เรียกว่าร่องรอยต้นไม้ซึ่งคล้ายกับรหัสเครื่องอย่างใกล้ชิดกว่า bytecode การวิเคราะห์และปรับให้เหมาะสมนั้นจะดำเนินการบนต้นไม้ของวิธีการ ในตอนท้ายต้นไม้จะถูกแปลเป็นรหัสพื้นเมือง

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

อ้างอิง:


1

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


0

20% ของรหัสไบต์ใช้ 80% ของเวลา คอมไพเลอร์ JIT ได้รับสถิติเหล่านี้และเพิ่มประสิทธิภาพ 20% ของรหัสไบต์เพื่อให้ทำงานได้เร็วขึ้นโดยการเพิ่มวิธีการแบบอินไลน์การลบล็อคที่ไม่ได้ใช้ ฯลฯ และยังสร้างรหัสไบต์เฉพาะสำหรับเครื่องนั้น ฉันอ้างจากบทความนี้ฉันพบว่ามันมีประโยชน์ http://java.dzone.com/articles/just-time-compiler-jit-hotspot


ไม่แน่ใจว่าทำไมจึงถูกทำเครื่องหมาย -1 ฉันคิดว่าจุดที่นี่คือสถิติเวลาทำงานที่ใช้เพื่อช่วยเพิ่มประสิทธิภาพ
— eze

ใช่ แต่คำตอบไม่ได้พูดอย่างนั้น แท้จริง JIT ไม่ได้เพิ่มประสิทธิภาพสูงสุด 20% ของรหัส
— mabraham

0

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


2
ฉันจะหลีกเลี่ยงการตอบคำถามเช่นนี้หากคุณไม่ได้ให้สิ่งใหม่ / ดีกว่า หากคุณได้รับการตอบโต้ใด ๆ มันอาจเป็นการลงคะแนนเสียงหรือคำวิจารณ์: คำตอบของคุณไม่ชัดเจน "JIT" ไม่ได้ จำกัด อยู่ที่Java Virtual Machine "เร็วกว่า แต่ใช้หน่วยความจำมากขึ้น" เป็นผลที่น่าจะเกิดขึ้น แต่ไม่ได้เกิดจากแนวคิดของ JIT และวิธีการต่างๆมักไม่ถูกคอมไพล์ในการเรียกใช้ครั้งแรก การใช้เวลากับ JIT เป็นประโยชน์โดยรวม
— zapl

0

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


0

Just In Time compiler หรือ JIT compiler ใช้สำหรับการปรับปรุงประสิทธิภาพใน Java มันถูกเปิดใช้งานโดยค่าเริ่มต้น เป็นการรวบรวมที่กระทำในเวลาดำเนินการค่อนข้างเร็วกว่า Java ได้รับความนิยมใช้ JIT คอมไพเลอร์โดยรวมไว้ใน JVM

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.