Nøgleforskel – maskinafhængig vs maskinuafhængig kodeoptimering
Computerprogrammer er sæt instruktioner givet til hardware for at udføre opgaver. Disse programmer er for det meste skrevet på højt niveau sprog, og computeren forstår ikke det sprog. Derfor bruges en compiler til at konvertere disse instruktioner til maskinkode eller målkode. Det går gennem flere faser for at bygge målkoden. Kodeoptimering er en af dem. Der er to optimeringsteknikker som maskinafhængig og maskinuafhængig kodeoptimering. Den vigtigste forskel mellem maskinafhængig og maskinuafhængig kodeoptimering er, at den maskinafhængige optimering anvendes på objektkode, mens maskinuafhængig kodeoptimering anvendes på mellemkoden.
Hvad er maskinafhængig kodeoptimering?
Når kildekoden konverteres til objektkode eller målkode, gennemgår compileren flere faser. Først gives kildekoden til Lexical analysator, som producerer tokens. Derefter gives outputtet til syntaksanalysator, som undersøger, om de genererede tokens er i logisk rækkefølge. Dette output gives til den semantiske analysator. Antag, at der er et stykke kode som p=q + r;
Her er p, q heltal, men r er en flyder. Ved hjælp af den semantiske analysator konverteres c-heltalsvariablen til en float. Derfor udfører den den semantiske analyse. Outputtet fra den semantiske analysator går til den mellemliggende kodegenerator. Det returnerer en mellemkode, som derefter går til kodeoptimering. Kodeoptimering er processen med at eliminere de ikke-essentielle programsætninger uden at ændre betydningen af den faktiske kildekode. Det er ikke en obligatorisk optimering, men det kan forbedre køretiden for målkoden. Udgangen af kodeoptimeringsværktøjet gives til kodegeneratoren, og til sidst bygges målkoden.
Figur 01: Compilerens faser
I maskinafhængig kodeoptimering anvendes optimering på kildekoden. Tildeling af tilstrækkelige mængder ressourcer kan forbedre udførelsen af programmet i denne optimering.
Hvad er maskinuafhængig kodeoptimering?
Når optimering udføres på mellemkoden, kaldes det den maskinuafhængige kodeoptimering. Der er forskellige teknikker til at opnå maskinuafhængig kodeoptimering. De er beskrevet ved hjælp af følgende eksempler.
Læs nedenstående kodelinjer.
for (j=0; j<10; j ++) {
b=x+2;
a[j]=5 j;
}
I henhold til ovenstående kode beregnes b=x+2 igen og igen i hver iteration. Når først b er beregnet, ændres det ikke. Så denne linje kan placeres uden for løkken som følger.
b=x+2;
for (j=0; j< 10; j++)
{a[j]=5j;
}
Dette kaldes kodebevægelse.
Læs nedenstående kodelinjer.
j=5;
if (j==10) {
a=b+20;
}
Ifølge ovenstående kode vil 'if block' aldrig udføres, fordi j-værdien aldrig vil være lig med 10. Den er allerede initialiseret til værdien 5. Derfor kan denne if-blok fjernes. Denne teknik er fjernelse af død kode.
En anden metode er styrkereduktion. Aritmetiske operationer som multiplikation kræver mere hukommelse, tid og CPU-cyklusser. Disse dyre udtryk kan erstattes af billige udtryk som b=a2; eller kan erstattes af addition, b=a + a;
Se nedenstående kode.
for (j=1; j <=5; j ++) {
value=j5;
}
I stedet for multiplikationen kan koden ændres som følger.
int temp=5;
for (j=1; j<=5; j++) {
temp=temp + 5;
value=temp;
}
Det er muligt at evaluere de udtryk, som er konstanter under kørsel. Det kaldes konstant foldning. Der kan angives som b[j+1]=c [j+1];
I stedet kan det ændres som følger.
n=j +1;
b[n]=c[n];
Der kan være sløjfer som følger.
for (j=0; j<5; j++) {
printf(“a\n”);
}
for (j=0; j <5; j++) {
printf(“b\n”);
}
Udskrivning af a og b har begge det samme antal iterationer. Begge kan kombineres til én for loop som følger.
for (j=0; j <5; j++) {
printf(“a \n”);
printf(“b\n”);
}
En anden vigtig teknik er eliminering af det almindelige underudtryk. Det er at erstatte de identiske udtryk med en enkelt variabel for at lave beregningen. Se nedenstående kode.
a=bc + k;
d=b c + m;
Denne kode kan konverteres som følger.
temp=bc;
a=temp + k;
d=temp + m;
Det er ikke nødvendigt at beregne bc igen og igen. Den multiplicerede værdi kan gemmes i en variabel og genbruges.
Hvad er ligheden mellem maskinafhængig og maskinuafhængig kodeoptimering?
Begge disse tilhører kodeoptimering
Hvad er forskellen mellem maskinafhængig og maskinuafhængig kodeoptimering?
Maskinafhængig vs maskinuafhængig kodeoptimering |
|
Maskinafhængig kodeoptimering anvendes på objektkode. | Maskin-uafhængig kodeoptimering anvendes på mellemkode. |
Involvering med hardware | |
Maskinafhængig optimering involverer CPU-registre og absolutte hukommelsesreferencer. | Maskinuafhængig kodeoptimering involverer ikke CPU-registre eller absolutte hukommelsesreferencer. |
Opsummering – Maskinafhængig vs maskinuafhængig kodeoptimering
Kodeoptimering består af to optimeringsteknikker, nemlig maskinafhængig og maskinuafhængig kodeoptimering. Forskellen mellem maskinafhængig og maskinuafhængig kodeoptimering er, at den maskinafhængige optimering anvendes på objektkode, hvorimod den maskinuafhængige kodeoptimering anvendes på mellemkode.
Download PDF-versionen af Machine Dependent vs Machine Independent Code Optimization
Du kan downloade PDF-versionen af denne artikel og bruge den til offline-formål i henhold til citatnotat. Download venligst PDF-version her Forskel mellem maskinafhængig og maskinuafhængig kodeoptimering