Comparație de performanță a buclei de date

Care dintre următoarele caracteristici au cea mai bună performanță?

Am văzut metoda a doua implementată în JavaScript cu câștiguri uriașe de performanță, dar nu am reușit să măsoară nici un câștig în C# și mă întrebam dacă compilatorul face deja metoda 2 chiar și atunci când este scris ca metoda 1.

Teoria din spatele metodei 2 este că codul nu are acces la DataTable.Rows.Count la fiecare iterație, poate accesa simplu int c.

Metoda 1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

Metoda 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}
0
fr hi bn

1 răspunsuri

Nu, nu poate face acest lucru, deoarece nu există nici o modalitate de a exprima constantă în timp pentru o valoare.

Dacă compilatorul ar fi capabil să facă acest lucru, ar trebui să existe o garanție din codul care returnează valoarea că valoarea este constantă și pe durata bucla nu se va schimba.

Dar, în acest caz, aveți libertatea de a adăuga noi rânduri în tabelul de date, ca parte a bucla dvs. și, prin urmare, depinde de dvs. să faceți această garanție, așa cum ați făcut-o.

Deci, pe scurt, compilatorul nu va face această optimizare dacă indicele final este altceva decât o variabilă.

În cazul unei variabile, în cazul în care compilatorul poate doar să privească codul de buclă și să vadă că această variabilă particulară nu este schimbată, s-ar putea să o facă și să încarce valoarea într-un registru înainte de a începe bucla, dar orice câștig de performanță din acest ar fi cel mai probabil neglijabil, cu excepția cazului în care corpul dvs. de buclă este gol.

Concluzie: Dacă știți sau doriți să acceptați că indicele de buclă finală este constantă pe durata bucla, plasați-o într-o variabilă.


Edit: Re-read your post, and yes, you might see negligible performance gains for your two cases as well, because the JITter optimizes the code. The JITter might optimize your end-index read into a direct access to the variable inside the data table that contains the row count, and a memory read isn't all that expensive anyway. If, on the other hand, reading that property was a very expensive operation, you'd see a more noticable difference.

0
adăugat