рдХреНрдпрд╛ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ C # рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП?

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

var length = array.Length; for (int i = 0; i < length; i++) {    //do smth } 

рдЙрдиреНрд╣реЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ Array.Length рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ CLR рдХреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд▓рдВрдмрд╛рдИ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП рдкрддрд╛ рдХрд░реЗрдВ (рдПрдХ рдмрд╛рд░ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП!) рдпрджрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрд╛рдд рд╣реИ рдпрд╛ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдордп рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрди C # рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

 public int WithoutVariable() {   int sum = 0;   for (int i = 0; i < array.Length; i++) {       sum += array[i];   }   return sum; } public int WithVariable() {   int sum = 0;   int length = array.Length;   for (int i = 0; i < length; i++) {       sum += array[i];   }   return sum; } 

рдЬреЗрдЖрдИрдЯреА рдХрдореНрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ (.NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.7.2 рдХреЗ рд▓рд┐рдП рд▓реЗрдЧреЗрдЬрд┐рдЯ-рдПрдХреНрд╕ 86 рдХреЗ рддрд╣рдд рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛) рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ:
рдмрд┐рдирд╛ рд╡рд┐рдЪрд╛рд░реЗрдмрд▓ ()
; int sum = 0;
xor edi , edi
; int i = 0;
xor esi , esi
; int [] localRefToArray = this.array;
Mov edx , dword ptr [ ecx + 4 ]
; int arrayLength = localRefToArray.Length;
рдореВрд╡ рдПрдХреНрдХреНрд╕ , рдбреЙрд░реНрдб рдкреАрдЯреАрдЖрд░ [ edx + 4 ]
; рдЕрдЧрд░ (рдПрд░реАрд▓реЛрдкреНрд░реЛрдЯреАрди == 0) рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐;
рдкрд░реАрдХреНрд╖рдг рдПрдХреНрд╕реНрдЯ , рдИрдПрдХреНрд╕рдПрдХреНрд╕
jle рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛
; int arrayLength2 = localRefToArray.Length;
Mov eax , dword ptr [ edx + 4 ]
, рдЕрдЧрд░ (i> = arrayLength2)
; рдирдИ indexOutOfRangeException () рдлреЗрдВрдХреЗрдВ;
рдкрд╛рд╢ :
cmp esi , eax
jae 056e2d31
; рдпреЛрдЧ + = рд▓реЛрдХрд▓рдлреНрд░реЗрдЯрдЕрд░реЗ [i];
рдПрдбреА рдЬреЛрдбрд╝реЗрдВ , рдбреНрд░рд╛рдлреНрдЯ ptr [ edx + esi * 4 + 8 ]
; i ++;
inc esi
, рдЕрдЧрд░ (i <arrayLength) рдЧреЛрдЯреЛ рд▓реВрдк
cmp ecx , esi
рдЧреБрдбрд╝ рд▓реВрдк
рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐;
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ :
Mov eax , edi
WithVariable ()
; int sum = 0;
xor esi , esi
; int [] localRefToArray = this.array;
Mov edx , dword ptr [ ecx + 4 ]
; int arrayLength = localRefToArray.Length;
Mov edi , dword ptr [ edx + 4 ]
; int i = 0;
xor eax , eax
; рдЕрдЧрд░ (рдПрд░реАрд▓реЛрдкреНрд░реЛрдЯреАрди == 0) рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐;
рдкрд░реАрдХреНрд╖рдг edi edi
рдЬреЗрд▓реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛
; int arrayLength2 = localRefToArray.Length;
рдореВрд╡ рдПрдХреНрдХреНрд╕ , рдбреЙрд░реНрдб рдкреАрдЯреАрдЖрд░ [ edx + 4 ]
, рдЕрдЧрд░ (i> = arrayLength2)
; рдирдИ indexOutOfRangeException () рдлреЗрдВрдХреЗрдВ;
рдкрд╛рд╢ :
cmp eax , ecx
jae 05902d31
; рдпреЛрдЧ + = рд▓реЛрдХрд▓рдлреНрд░реЗрдЯрдЕрд░реЗ [i];
esi рдЬреЛрдбрд╝реЗрдВ , dword ptr [ edx + eax * 4 + 8 ]
; i ++;
inc eax
, рдЕрдЧрд░ (i <arrayLength) рдЧреЛрдЯреЛ рд▓реВрдк
cmp eax edi
рдЬреЗрдПрд▓ рд▓реВрдк
рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐;
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ :
mov eax , esi

рдореЗрд▓реНрдб рдореЗрдВ рддреБрд▓рдирд╛:


рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдорд╛рдореВрд▓реА рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рди рд╣реИ - 15. рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рддрд░реНрдХ рднреА рд▓рдЧрднрдЧ рдПрдХ рдЬреИрд╕рд╛ рд╣реИред рдЪрдХреНрд░ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдЪрд░ рдФрд░ рддреБрд▓рдирд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рд╣рдо рдиреЛрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдЪрдХреНрд░ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рд░ рджрд░реНрдЬ рдХреА рдЧрдИ рд╣реИ:

  • 0 (arrayLength) рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • рдЪрдХреНрд░ рд╕реНрдерд┐рддрд┐ (arrayLength2) рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдореЗрдВред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕рдЯреАрдХ рдПрдХ рд╣реА рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рддреЗрдЬреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛрдб рдиреЗ рдореБрдЭреЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдХреБрдЫ рдФрд░ рддрд░реАрдХреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛:

 public int WithoutVariable() {   int sum = 0;   for(int i = 0; i < array.Length; i++) {       sum += array[i] + array.Length;   }   return sum; } public int WithVariable() {   int sum = 0;   int length = array.Length;   for(int i = 0; i < length; i++) {       sum += array[i] + length;   }   return sum; } 

рдЕрдм рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдФрд░ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рд╣рд░ рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рдХреЛрдб рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:
рдмрд┐рдирд╛ рд╡рд┐рдЪрд╛рд░реЗрдмрд▓ ()
int sum = 0 ;
xor edi , edi
int i = 0 ;
xor esi , esi
int [ ] localRefToArray = рдпрд╣ рд╕рд░рдгреА ;
Mov edx , dword ptr [ ecx + 4 ]
int arrayLength = localRefToArray ред рд▓рдВрдмрд╛рдИ ;
рдореВрд╡ рдПрдмрдХреНрд╕ , рдбреЙрд░реНрдб рдкреАрдЯреАрдЖрд░ [ edx + 4 ]
рдЕрдЧрд░ ( рдПрд░реЗрдиреНрдЧреНрд▓реЛрдореЗрдЯреНрд░реА == 0 ) рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐ ;
рдкрд░реАрдХреНрд╖рд╛ ebx , ebx
рдЬреЗрд▓реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛
int arrayLength2 = localRefToArray ред рд▓рдВрдмрд╛рдИ ;
рдореВрд╡ рдПрдХреНрдХреНрд╕ , рдбреЙрд░реНрдб рдкреАрдЯреАрдЖрд░ [ edx + 4 ]
рдЕрдЧрд░ ( i> = arrayLength2 )
рдирдИ indexOutOfRangeException ( ) рдлреЗрдВрдХреЗрдВ ;
рдкрд╛рд╢ :
cmp esi ecx
jae 05562d39
int t = array [ i ] ;
Mov eax , dword ptr [ edx + esi * 4 + 8 ]
t + = рд░рд╛рд╢рд┐ ;
рдИрдбреАрдПрдХреНрд╕ , рдПрдбреА рдЬреЛрдбрд╝реЗрдВ
t + = arrayLength ;
eax , ebx рдЬреЛрдбрд╝реЗрдВ
sum = t ;
рдЪрд▓ рдИрдбреА , рдИрдПрдХреНрд╕рдПрдХреНрд╕
рдореИрдВ ++ ;
inc esi
рдЕрдЧрд░ ( i <arrayLength ) рдЧреЛрдЯреЛ рд▓реВрдк
cmp рдИрдмреЗрдХреНрд╕ , рдПрд╕рдИрдЖрдИ
рдЧреБрдбрд╝ рд▓реВрдк
рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐ ;
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ :
Mov eax , edi
WithVariable ()
int sum = 0 ;
xor esi , esi
int [ ] localRefToArray = рдпрд╣ рд╕рд░рдгреА ;
Mov edx , dword ptr [ ecx + 4 ]
int arrayLength = localRefToArray ред рд▓рдВрдмрд╛рдИ ;
рдореВрд╡ рдПрдмрдХреНрд╕ , рдбреЙрд░реНрдб рдкреАрдЯреАрдЖрд░ [ edx + 4 ]
int i = 0 ;
рдПрдХреНрд╕реЛрд░ рдПрдХреНрдПрдХреНрд╕рдПрдХреНрд╕ , рдИрдПрдХреНрд╕рдПрдХреНрд╕
рдЕрдЧрд░ ( рдПрдВрдЬрд╝рд▓рдореИрдЧреНрдирд┐ = = реж )
рдкрд░реАрдХреНрд╖рд╛ ebx , ebx
jle рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛
int arrayLength2 = localRefToArray ред рд▓рдВрдмрд╛рдИ ;
Mov edi , dword ptr [ edx + 4 ]
рдЕрдЧрд░ ( i> = arrayLength2 )
рдирдИ indexOutOfRangeException ( ) рдлреЗрдВрдХреЗрдВ ;
рдкрд╛рд╢ :
cmp ecx edi
рдЬрд╛ режрек рдмреА резреи рдбреА рей реп
int t = array [ i ] ;
Mov eax , dword ptr [ edx + ecx * 4 + 8 ]
t + = рд░рд╛рд╢рд┐ ;
рдИрдПрдХреНрд╕ , рдИрдПрд╕рдЖрдИ рдЬреЛрдбрд╝реЗрдВ
t + = arrayLength ;
eax , ebx рдЬреЛрдбрд╝реЗрдВ
sum = t ;
рдЪрд▓ рдПрд╕рд┐ , рдмрд╛рдЬ
рдореИрдВ ++ ;
inc Ecx
рдЕрдЧрд░ ( i <arrayLength ) рдЧреЛрдЯреЛ рд▓реВрдк
cmp ecx , ebx
рдЬреЗрдПрд▓ рд▓реВрдк
рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐ ;
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ :
mov eax , esi

рдореЗрд▓реНрдб рдореЗрдВ рддреБрд▓рдирд╛:


рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рди рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде (рд▓рдЧрднрдЧ) рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВред рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЪрдХреНрд░ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдХреНрд░рдо рд╣реИред рдЖрдк рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдореЗрдВ, рд╕рд░рдгреА рдХреА рдХреЗрд╡рд▓ рдкрд╣рд▓реА рд▓рдВрдмрд╛рдИ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣:
int arrayLength2 = localRefToArray ред рд▓рдВрдмрд╛рдИ ;
Mov edi , dword ptr [ edx + 4 ]
рдЕрдЧрд░ ( i> = arrayLength2 ) рдирдИ IndexOutOfRangeException ( ) рдлреЗрдВрдХ рджреЗрдВ ;
cmp ecx edi
рдЬрд╛ режрек рдмреА резреи рдбреА рей реп

рд╕рднреА рдЪрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд░рдгреА рд╕реАрдорд╛ рдХреА рдЬрд╛рдБрдЪ рд╣реИ рдФрд░ рдпрд╣ рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЧрдИ рд╣реИред

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╣рд▓реЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ: рдЪрдХреНрд░ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдордп рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡реИрд╕реЗ рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░реЗрдЧрд╛ред рдПрдХ рд▓рдВрдмрд╛рдИ рд╕рд░рдгреА рдХреЛ рдПрдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рдирд╛ рд╣реИред

ForEach рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 public int ForEachWithoutLength() {   int sum = 0;   foreach (int i in array) {       sum += i;   }   return sum; } public int ForEachWithLengthWithoutLocalVariable() {   int sum = 0;   foreach (int i in array) {       sum += i + array.Length;   }   return sum; } public int ForEachWithLengthWithLocalVariable() {   int sum = 0;   int length = array.Length;   foreach (int i in array) {       sum += i + length;   }   return sum; } 

рдФрд░ рдпрд╣рд╛рдБ JIT рдХреЗ рдмрд╛рдж рдХрд╛ рдХреЛрдб рд╣реИ:

ForEachWithoutLength ()
; int sum = 0;
xor esi , esi
; int [] localRefToArray = this.array;
Mov ecx , dword ptr [ ecx + 4 ]
; int i = 0;
xor edx , edx
; int arrayLength = localRefToArray.Length;
Mov edi , dword ptr [ ecx + 4 ]
, рдЕрдЧрд░ (рдПрд░реАрд▓реЛрдкреНрд░реЛрдЯреАрди == 0) рдЧреЛрдЯреЛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ;
рдкрд░реАрдХреНрд╖рдг edi edi
jle рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛
; int t = array [i];
рдкрд╛рд╢ :
Mov eax , dword ptr [ ecx + edx * 4 + 8 ]
; рдпреЛрдЧ + = рдореИрдВ;
esi , eax рдЬреЛрдбрд╝реЗрдВ
; i ++;
inc edx
, рдЕрдЧрд░ (i <arrayLength) рдЧреЛрдЯреЛ рд▓реВрдк
cmp edi edx
рдЧреБрдбрд╝ рд▓реВрдк
рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐;
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ :
mov eax , esi

рдлреЙрд░рдПрдерд╡рд┐рде рд▓реИрдВрде рд╡рд┐рдердЖрдЙрдЯрд▓реЛрдХ рд╡реИрдХреНрд░рд┐рдп ()
; int sum = 0;
xor esi , esi
; int [] localRefToArray = this.array;
Mov ecx , dword ptr [ ecx + 4 ]
; int i = 0;
xor edx , edx
; int arrayLength = localRefToArray.Length;
Mov edi , dword ptr [ ecx + 4 ]
, рдЕрдЧрд░ (рдПрд░реЗрдкреНрд▓реЗрдиреНрдЧ = = 0) рдЧреЛрдЯреЛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
рдкрд░реАрдХреНрд╖рдг edi edi
jle рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛
; int t = array [i];
рдкрд╛рд╢ :
Mov eax , dword ptr [ ecx + edx * 4 + 8 ]
; рдпреЛрдЧ + = рдореИрдВ;
esi , eax рдЬреЛрдбрд╝реЗрдВ
; рдпреЛрдЧ + = рд▓реЛрдХрд▓рдлреНрд░реЗрдЯрдЕрд░реЗ.рд▓рд┐рдлреНрдЯ;
esi рдЬреЛрдбрд╝реЗрдВ , dword ptr [ ecx + 4 ]
; i ++;
inc edx
, рдЕрдЧрд░ (i <arrayLength) рдЧреЛрдЯреЛ рд▓реВрдк
cmp edi edx
рдЧреБрдбрд╝ рд▓реВрдк
рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐;
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ :
mov eax , esi

ForEachWithLengthWithLocalVariable ()
; int sum = 0;
xor esi , esi
; int [] localRefToArray = this.array;
Mov edx , dword ptr [ ecx + 4 ]
; int рд▓рдВрдмрд╛рдИ = localRefToArray.Length;
рдореВрд╡ рдПрдмрдХреНрд╕ , рдбреЙрд░реНрдб рдкреАрдЯреАрдЖрд░ [ edx + 4 ]
; int i = 0;
рдПрдХреНрд╕реЛрд░ рдПрдХреНрдПрдХреНрд╕рдПрдХреНрд╕ , рдИрдПрдХреНрд╕рдПрдХреНрд╕
; int arrayLength = localRefToArray.Length;
Mov edi , dword ptr [ edx + 4 ]
, рдЕрдЧрд░ (рдПрд░реАрд▓реЛрдкреНрд░реЛрдЯреАрди == 0) рдЧреЛрдЯреЛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ;
рдкрд░реАрдХреНрд╖рдг edi edi
jle рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛
; int t = array [i];
рдкрд╛рд╢ :
Mov eax , dword ptr [ edx + ecx * 4 + 8 ]
; рдпреЛрдЧ + = рдореИрдВ;
esi , eax рдЬреЛрдбрд╝реЗрдВ
; рдпреЛрдЧ + рд▓рдВрдмрд╛рдИ;
рдПрд╕рдИрдЖрдИ рдЬреЛрдбрд╝реЗрдВ , рдПрдмреНрд╕
; i ++;
inc Ecx
, рдЕрдЧрд░ (i <arrayLength) рдЧреЛрдЯреЛ рд▓реВрдк
cmp edi ecx
рдЧреБрдбрд╝ рд▓реВрдк
рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐;
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ :
mov eax , esi

рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЪрдХреНрд░ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдХрдо рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ рд▓реЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдзрд╛рд░рдг рддрддреНрд╡ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ 12 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди 15 рдХреЗ рд▓рд┐рдП )ред
рддреБрд▓рдирд╛


рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдпрд╣рд╛рдВ 1 рдорд┐рд▓рд┐рдпрди-рддрддреНрд╡ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдо рдлрд╝реЙрд░рдЪ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
 sum+=array[i]; 
рд╡рд┐рдзрд┐
ItemsCount
рдореАрди
рддреНрд░реБрдЯрд┐
StdDev
рдордВрдЭрд▓рд╛
рдЕрдиреБрдкрд╛рдд
RatioSD
foreach
1000000
1.401 рдорд┐
0.2691 рдорд┐
0.7935 рдорд┐
1.694 рдПрдордПрд╕
1.00
0.00
рдХреЗ рд▓рд┐рдП
1000000
1.586 рдорд┐
0.3204 рдПрдордПрд╕
0.9447 рдПрдордПрд╕
1.740 рдорд┐
1.23
0.65
рдФрд░ рдХреЗ рд▓рд┐рдП
 sum+=array[i] + array.Length; 
рд╡рд┐рдзрд┐
ItemsCount
рдореАрди
рддреНрд░реБрдЯрд┐
StdDev
рдордВрдЭрд▓рд╛
рдЕрдиреБрдкрд╛рдд
RatioSD
foreach
1000000
1.703 рдорд┐
0.3010 рдорд┐
0.8874 рдорд┐
1.726 рдорд┐
1.00
0.00
рдХреЗ рд▓рд┐рдП
1000000
1.715 рдорд┐
0.2859 рдорд┐
0.8430 рдорд┐
1.956 рдорд┐
1.13
0.56

ForEach рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдХреНрдпреЛрдВ? рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ JIT рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рд╕рднреА рддреАрди рдлреЙрд░рдЪ рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛


рдЖрдЗрдП ForEachWithoutLength рдХреЛ рджреЗрдЦреЗрдВред рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдХреА рдЧрдИ рд╣реИ рдФрд░ рд╕рд░рдгреА рд╕реАрдорд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ForEach рдЪрдХреНрд░ рдкрд╣рд▓реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдмрджрд▓рдиреЗ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдХрднреА рднреА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕рдХреЗ рдХрд╛рд░рдг, JIT рдЪреЗрдХ рдРрд░реЗ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреА рд╣реИред

рдЕрдм ForEachWithLengthWIthoutLocalVariable рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЕрдЬреАрдм рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпреЛрдЧ + = рд▓рдВрдмрд╛рдИ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╕рд░рдгреА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдП рдХреЗ рд▓рд┐рдП рдЬреЛ рдРрдк рд╣рд░ рдмрд╛рд░ рдореЗрдореЛрд░реА рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐, рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП N + 1 рдореЗрдореЛрд░реА рдЕрдиреБрд░реЛрдз рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ N рдПрдХ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рд╣реИред

рдФрд░ рдЕрдм рд╣рдо ForEachWithLengthWithLocalVariable рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдХреЛрдб рд▓рдВрдмрд╛рдИ рд▓рдВрдмрд╛рдИ рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рд╣реА рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡реИрд░рд┐рдПрдмрд▓ рдПрд░реЗрд▓реЗрд╡реЗрдиреНрде рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрд░реЗ рдЦрд╛рд▓реА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдЕрднреА рднреА рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╣рдорд╛рд░реА рдмрддрд╛рдИ рд╣реБрдИ рд╕реНрдерд╛рдиреАрдп рд╡реИрд░рд┐рдПрдмрд▓ рд▓рдВрдмрд╛рдИ рдХреЛ рдмрдЪрд╛рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрдХреНрд░ рдХреЗ рдЕрдВрджрд░ рд╕рдорд╛рдХрд▓рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рджреЛ рдмрд╛рд░ рдореЗрдореЛрд░реА рд╕реЗ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИред рдЕрдВрддрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдиреЛрдЯрд┐рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди рд╣реИред

рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдЗрддрдирд╛ рд╕рд░рд▓ рдирд┐рдХрд▓рд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реНрд╡рдпрдВ рд╕рд░рд▓ рд╣реИрдВред рдпрджрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЪрд░ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдЯреЛрд░ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪреЗрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рддрд░реНрдХ рд╕рдорд╛рди рд░рд╣реЗрдЧрд╛: рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдкреЗрд╢ рдХрд░рдирд╛ рдХреЗрд╡рд▓ рд╣реИ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреАред рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ Foreach рдЕрдХреНрд╕рд░ рдХреЗ рд▓рд┐рдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi454582/


All Articles