14-ameliy_paradigma_qq
.pdf
14-ámeliy jumıs. Peephole optimallastırıw. Looptı optimallastırıw
Jumıstıń maqseti: Kompilyatorlar tárepinen ámelge asırılatuǵın kodtı optimallastırıw (Optimization) usılların úyreniw. Peephole (tesikten qaraw) optimizaciyası hám Cikllerdi (Loop) optimallastırıw texnikaların túsiniw. Qol menen jazılǵan kodtıń ónimliligin (performance) arttırıw hám artıqsha instrukciyalardı alıp taslaw kónlikpelerin qáliplestiriw.
Teoriyalıq bólim: Optimallastırıw – programmanıń islew tezligin arttırıw yamasa yad kólemin kishireytiw procesi.
1.Peephole Optimization: Kodtıń kishi bólegine ("tesikke") qarap, onıń ornına effektlirek ekvivalent kodtı qoyıw.
*Mısalı: x = x + 0 -> (Hesh nárse isleme).
*x = x * 2 -> x = x << 1 (Bitli jılıstırıw tezirek).
2.Loop Optimization: Cikller programmanıń eń kóp waqıt alatuǵın bólegi bolǵanlıqtan, olardı tezletiw.
*Loop Unrolling (Cikldi ashıw): Iteraciyalar sanın azaytıw.
*Loop Invariant Code Motion: Cikl ishinde ózgermeytuǵın esaplawlardı sırtqa shıǵarıw.
ÁMELIY BÓLIM:
C++ kodlarında optimizaciyanıń qalay isleytuǵınınıń hám qalay qol menen optimallastırıwǵa bolatuǵının kórip shıǵamız.
1-mısal: Peephole - Algebraikalıq ápiwayılastırıw Másele: Paydasız ámellerdi alıp taslaw.
Kod (Optimallastırılmaǵan): int a = 10;
a = a + 0; |
// Paydasız |
a = a * 1; |
// Paydasız |
int b = 5;
b = b * 2; // Kóbeytiw (ástelew)
Kod (Optimallastırılǵan): int a = 10;
//a = a + 0; -> Óshiriledi
//a = a * 1; -> Óshiriledi
int b = 5;
b = b << 1; // Bitli jılıstırıw (shift left) - processorda tezirek
Túsindirme: Kompilyatorlar (-O2 bayraǵı menen) bunı avtomat túrde isleydi.
2-mısal: Loop Invariant Code Motion (Turaqlını sırtqa shıǵarıw)
Másele: Cikl ishinde hár saparı birdey mánisti qayta esaplawdı boldırmaw.
Kod (Optimallastırılmaǵan): for (int i = 0; i < 1000; i++) {
int x = y * z; // y hám z cikl ishinde ózgermeydi arr[i] = i * x;
}
Kod (Optimallastırılǵan):
int x = y * z; // Bir ret esaplap alamız for (int i = 0; i < 1000; i++) {
arr[i] = i * x;
}
Túsindirme: Eger kóbeytiw ámeli 1000 ret orınlanıwınıń ornına 1 ret orınlansa, waqıt únemlenedi.
3-mısal: Loop Unrolling (Cikldi ashıw)
Másele: Cikldi basqarıwǵa ketetuǵın (tekseriw, arttırıw) qosımsha shıǵındını azaytıw.
Kod (Optimallastırılmaǵan): for (int i = 0; i < 100; i++) {
sum += arr[i];
}
Kod (Optimallastırılǵan - 4 ke ashılǵan): for (int i = 0; i < 100; i += 4) {
sum += arr[i]; sum += arr[i+1]; sum += arr[i+2]; sum += arr[i+3];
}
Túsindirme: Iteraciyalar sanı 100 den 25 ke túsedi. Processor buyrıqlardı parallel orınlaw (pipelining) imkaniyatınan jaqsıraq paydalanadı.
4-mısal: Strength Reduction (Kúshli operaciyanı hálsizge almastırıw)
Másele: Qımbat operaciyanı (kóbeytiw) arzan operaciyaǵa (qosıw) almastırıw.
Kod (Optimallastırılmaǵan): for (int i = 0; i < 10; i++) {
int offset = i * 5; // Kóbeytiw qımbat cout << offset << endl;
}
Kod (Optimallastırılǵan): int offset = 0;
for (int i = 0; i < 10; i++) { cout << offset << endl;
offset += 5; // Qosıw arzanıraq
}
5-mısal: Dead Code Elimination (Óli kodtı óshiriw) Másele: Heshqashan orınlanbaytuǵın kodtı tazalaw. Kod (Optimallastırılmaǵan):
int x = 10; if (false) {
x = 20; // Bul jerge heshkim kirmeydi
}
return x;
Kod (Optimallastırılǵan): int x = 10;
// if blogı tolıq óshiriledi return x;
ÁMELIY TAPSÍRMALAR
1-tapsırma: Peephole analiz.
Tómendegi kodtıń optimallastırılǵan nusqasın (C++ tilinde) jazıń: int a = 100;
a = a / 1; a = a + 0;
int b = a * 4; (Bitli jılıstırıw qollanıń) int c = b / 2; (Bitli jılıstırıw qollanıń)
2-tapsırma: Invarianttı shıǵarıw.
Kodtı optimallastırıń:
for (int i = 0; i < n; i++) {
double k = sin(PI / 2); // PI - konstanta arr[i] = arr[i] + k;
}
3-tapsırma: Cikldi ashıw (Unrolling).
Tómendegi cikldi 5 qádemge ashıń (N = 100 dep esaplań). for (int i = 0; i < N; i++) {
cout << "Sálem" << endl;
}
4-tapsırma: Kúshli operaciyanı almastırıw.
Massiv elementleriniń indeksin esaplaw kodın optimallastırıń (kóbeytiwdi qosıwǵa almastırıń):
for (int i = 0; i < 10; i++) {
cout << "Index: " << i * 8 << endl;
}
5-tapsırma: Shártli optimizaciyalar.
Kodtı tazalań (Dead code): int x = 5;
if (x > 10) {
cout << "Úlken";
} else {
cout << "Kishi";
}
//Bul jerde x hár qashan 5, demek if shárti hám else tarmaǵı aldın ala belgili.
//Kompilyator qanday kod qaldıradı?
