Ce este eax mai eficient sau adăugați eax, o suprapunere de stivă în limba rusă

Am început să studiez asamblor, știu C / C ++. Așa că am decis să mă bazez pe cunoștințele deja existente și am început să dezasamblez codul meu scris și să văd cum funcționează.







Și imediat a intrat într-un moment ilogic.
Dacă în asamblare există o funcție de creștere a valorii argumentului inc. atunci ar trebui să difere de adăugarea 1 în registru prin adăugarea eax, 1.
De obicei, am presupus că, dacă există astfel de funcții, ele sunt mai eficiente. dar dacă te uiți la codul i ++:

Ce este mai bine să utilizați: inc sau adăugați în acest caz?

Cred că compilatorul a fost prost. Probabil faptul că teoretic rezultatul lui i ++ poate fi folosit mai târziu este afectat și, din acest motiv, încearcă să salveze rezultatul în r \ eax. De fapt, compilatorul ar putea genera pur și simplu

În plus, există în mod evident trei instrucțiuni în loc de unul, iar acest lucru este cu siguranță mai lent (cu excepția cazului în care valoarea i ++ este necesară mai târziu).

În ceea ce privește comparația explicită adaugă EAX, 1 și EAX Inc, atunci bănuiesc că diferența de viteză nu este, dar cifra 1 are loc, ceea ce înseamnă că va avea loc în codul coadă prefetch și poate juca un rol negativ. Și poate că nu se joacă.

Pe de altă parte, compilatorul utilizează cu adevărat add eax, 1:

Oferă rezultatul fără inc'а

Pe de altă parte, compilatorul Java JIT folosește uneori inc. a văzut ..







Bineînțeles, puneți întrebări! Totul este atât de dependent de fier!

Regula generală este simplă: în ceea ce privește generarea codului de asamblare, compilatorul este întotdeauna mai inteligent (mai conștient) decât tine. Dacă face asta, atunci va fi mai bine.

Al doilea gând: esti bazat pe un mesaj fals. Introducerea de noi instrucțiuni de mașină nu este întotdeauna dictată de eficiența calculelor. Există încă un lucru precum eficacitatea programatorilor - sunt de acord, inc scrie mult mai ușor decât adăugați eax, 1;). Și operația este extrem de frecventă.

Acum, de ce add este mai rapid decât inc. (Tot ce scriu acum nu este obligatoriu să fie adevărat - mi se pare totuși). De fapt, inc. spre deosebire de adăugați. nu modifică starea steagului de transport. Și alte steaguri se schimbă. Din moment ce eu nu cunosc nici o arhitectură pe care este posibil să se pună steagurile unul câte unul, nu toate împreună, am încercat să precizeze următoarele: Inc „în mai întâi trebuie să ia în considerare starea actuală a drapelului de transport (care dă naștere la o relație falsă cu oprirea ulterioară a transportorului). Și adăugați că nu este necesar, deoarece o suprascrie. Prin urmare, creșterea productivității.

P.S. Disclaimer din nou: am făcut acest lucru nu este foarte bun încă înțeleg (de contact șase luni mai târziu - aparent, până când eu sunt un expert în acest domeniu =)). Doar undeva am auzit ceva de genul asta.

răspuns dat 14 februarie '11 la 21:57

gcc (GCC) 3.4.5 (mingw-vista special r3)

utilizează inclusiv pentru i ++ j ++

Atunci când se compilează cu -O3, ea deține, în general, variabile în registre. gcc -S -O3

nu (pentru timp) codul:

Despre viteza de execuție. Personal, mi se pare că într-un cod ciclic de dimensiuni rezonabile pentru implementarea actuală a arhitecturii x86 viteza de performanță va fi, la prima vedere destul de ciudat, aceeași. Acest lucru se datorează preselecției comenzilor și convertirii lor la comenzile procesorului de tip RISC.







Articole similare

Trimiteți-le prietenilor: