Vad är just-in-time (JIT) -sammanställning?

0
294

Just-In-Time compilation, eller JIT, är en teknik som används av körningstolkar för språk som JavaScript, C#och Java för att föra exekveringshastigheter närmare den inbyggda prestanda som erbjuds av förkompilerade binära språk som C ++.

Compilers vs. Tolkar

Datorer vet inte hur man kör programmeringsspråk på hög nivå som C ++, åtminstone inte direkt. För att översätta mänskligt läsbar kod till något som din CPU kan köra måste den konverteras. En dator gör vanligtvis detta genom en av två metoder — sammanställning eller tolkning.

Sammanställning innebär att du kör en kompilator, ett program som tar källkoden och konverterar den till binär maskinkod innan programmet körs. Sammanställningen sker på enhetens dator innan den packas och skickas ut. De flesta körbara filer som du laddar ner sammanställs på någon nivå för att köra på din maskin, och kompilerad kod är vanligtvis ganska snabb eftersom kompilatorn kan göra optimeringar för just din maskin.

Men kompilatorer har några nackdelar. Program måste kompileras för specifika CPU-instruktionsuppsättningar (som x86-64 eller ARM). Utöver det måste även operativsystem som delar instruktionsuppsättningar (som Windows och Linux, som båda körs på Intel -processorer) ha program sammanställda separat på grund av de många skillnaderna i hur de fungerar.

Detta betyder att för något som JavaScript, som måste skickas över internet till anslutna klienter, kan det inte sammanställas i förväg, eftersom klienten kan köra vilken kombination av instruktionsuppsättning som helst och operativsystem.

Annons

Tolkar har en annan inställning. En tolk är i grunden en mjukvarurobot som tar källkoden för ett program som ett JavaScript- eller Python -skript och hanterar utförandet vid körning. Den fungerar i huvudsak som ett mellanlager mellan källkoden och maskinen och står där en kompilator skulle översätta den direkt.

Detta har den stora fördelen att det inte krävs att programmet byggs för en viss maskin; så länge som maskinen kan köra Python-tolk kan den köra alla Python-skript.

Vad gör JIT-kompilering?

Tyvärr för tolkar är de långsamma. En sann tolk måste översätta och hantera varje instruktion, i huvudsak göra en kompilators jobb för varje körning. Det är mycket overhead, så i verkligheten använder de flesta tolkar som V8 JavaScript-motorn, Java Virtual Machine (JVM) och .NET: s Common Language Runtime just-in-time-sammanställning för att snabba upp tolkaren.

Just-In-Time-kompilering är i huvudsak en kompilator som försenar och bara sammanställer koden för varje funktion när den behövs. När du ringer en funktion, om JIT -kompilatorn inte har sett den ännu, kommer den att kompilera den funktionen (tillämpa eventuella optimeringar för den maskin den körs på) och köra den. Nästa gång du anropar funktionen har den redan maskinkoden till hands, så den behöver bara leta upp den från cacheminnet.

Just-In-Time hänvisar till det faktum att tolken inte &# 8217; t måste kompilera hela appen på en gång. Det kan det verkligen, men för en stor app skulle det leda till mycket höga starttider. Det är bättre att prestanda bara gör kompilering när det behövs (dvs precis i tid).

Har JIT Compilation en prestandahit?

JIT är bokstavligen bara en prestationsförbättring jämfört med vanliga tolkar, så jämfört med att inte göra det alls är det mycket snabbare. Att kompilera kod är dock inte särskilt snabbt, så uppenbarligen gör kompilering vid körning en prestandaträff jämfört med om den kompilerades direkt till bytekod i förväg.

Annonsering

Men eftersom JIT -sammanställning vanligtvis måste bara köras första gången en funktion åberopas, vanliga funktioner kommer bara att se en prestandaträff på den första anropet. Du kan testa detta i C#med StopWatches — de tar upp .NET “ bakgrundsljud, ” inklusive den tid som används för att göra JIT-kompilering vid den första körningen av en funktion.

Den primära nackdelen med JIT-kompilerade applikationer är en hög kall starttid, eftersom tusentals funktioner som kallas vid start måste sammanställas direkt i början . Vissa ASP.NET -webbprogram kan ta över en minut att starta upp, delvis på grund av stor belastning på JIT -kompilatorn i början.