Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 GateKiller
GateKiller

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
}
11 2008-08-07T10:01:04+00:00 1
Programare
c#
performance
loops
Comentarii la întrebare (0)
Lasse V&#229;gs&#230;ther Karl
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#4562

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
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RU
© Answer-ID 2021
Sursă
https://stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire