рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓реЗрдВ

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рджрд┐рди рдореЗрд░реЗ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдХреА рдорджрдж рдХреАред рд░рд╛рд╕реНрддреЗ рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ (рдЗрдВрдЯ) рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрднреЗрджреНрдп рдХреА рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдорд╛рдирдХ рдЙрдкрдХрд░рдг рдХреА рдЧрддрд┐ (Convert.ToInt32 рдФрд░ Int32.Parse) рдХреЗ рд╕рд╛рдеред рдЗрд╕ рддреБрд▓рдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдХреБрдЫ рд╣рдж рддрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд┐рдХрд▓рд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
class MyConvert { private static int CharToInt(char c) { return c - '0'; } public static int ToInt(string s) { if (s == null) throw new ArgumentException(); if (s.Length == 0) throw new ArgumentException(); bool isNegative = false; int start = 0; switch (s[0]) { case '-': if (s.Length == 1) throw new ArgumentException(); start = 1; isNegative = true; break; case '+': if (s.Length == 1) throw new ArgumentException(); start = 1; break; } int result = 0; for (int i = start; i < s.Length; i++) { if (c < '0' || c > '9') throw new ArgumentException(); result = checked(result * 10 + CharToInt(s[i])); } return (isNegative) ? -result : result; } } 


рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗ:
  static void MyConvertTest(int numbersCount) { for (int i = - numbersCount; i < numbersCount; i++) { if (i != MyConvert.ToInt(i.ToString())) { throw new ArgumentException(); } } } static void ConvertTest(int numbersCount) { for (int i = - numbersCount; i < numbersCount; i++) { if (i != Int32.Parse(i.ToString())) { throw new ArgumentException(); } } } 


рдореЗрд░реА рдорд╢реАрди рдкрд░ (рд╡рд┐рдВрдбреЛрдЬ 7, .NET 4.0, рдЗрдВрдЯреЗрд▓ i5) рдирдВрдмрд░ рдХреЗ рд╕рд╛рде = 16,000,000, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдФрд╕рдд рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
ConvertTest: 08.5859994 рд╕реЗрдХрдВрдб
MyConvertTest: 07.0505985 рд╕реЗрдХрдВрдб

рдпрджрд┐ рдЖрдк Int32.Parse рдХреЗ рдмрдЬрд╛рдп Convert.ToInt32 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Convert.ToInt32 рдлрд╝рдВрдХреНрд╢рди рдЦреБрдж рдХреЛ Int32.Parse рдХрд╣рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рдЕрдкрдиреА рдмрд╛рдЗрдХ рдХреА рдЧрддрд┐ рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрддрд┐ ~ 18% рд╕реЗ рддреЗрдЬ рд╣реИред

рдпрджрд┐ рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ , рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди Int32.Parse рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреНрд╖реЗрддреНрд░реАрдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдореБрдЭреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рдЖрдЗрдП рд╣рдорд╛рд░реА рд░рдЪрдирд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рддреЗрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ToInt рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓реВрдк рдмрджрд▓реЗрдВ
  for (int i = start; i < s.Length; i++) 

рдкрд░
  int length = s.Length; for (int i = start; i < length; i++) 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
MyConvertTest: 06.2629928 рд╕реЗрдХрдВрдб
рдпрд╣реА рд╣реИ, рдЕрдм рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрддрд┐ рдорд╛рдирдХ рд╕реЗ ~ 27% рдЕрдзрд┐рдХ рддреЗрдЬ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ (рдпрд╛ рд╕реАрдПрд▓рдЖрд░) рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдХрд┐ рдЪреВрдВрдХрд┐ рд╣рдо рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдПрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрд╕.рд▓рд┐рдлреНрдЯ рд╡реЗрд▓реНрдпреВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред

рдЕрдм CharToInt рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЕрдкрдиреЗ рд╢рд░реАрд░ рдХреЛ ToInt рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
MyConvertTest: 05.5496214 рд╕реЗрдХрдВрдб
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдкрд░реЗрд╢рди рдХреА рдЧрддрд┐ рдореЗрдВ ~ 35% рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИред рдпрд╣, рдмрджрд▓реЗ рдореЗрдВ, рдХрд╛рдлреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ (рдпрд╛ рд╕реАрдПрд▓рдЖрд░) рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрдкрдиреЗ рджрдо рдкрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд▓рдЧрднрдЧ рд╣рд░ рдЪреАрдЬ рдХреЛ рдЖрдЬрдорд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
  unsafe public static int ToInt(string s) { if (s == null) { throw new ArgumentException(); } int result = 0; bool isNegative = false; fixed(char* p = s) { char* chPtr = p; char ch = *(chPtr++); switch (ch) { case '-': isNegative = true; ch = *(chPtr++); break; case '+': ch = *(chPtr++); break; } do { if (ch < '0' || ch > '9') { throw new ArgumentException(); } result = result * 10 + (ch - '0'); ch = *(chPtr++); }while (ch != '\0'); } return (isNegative) ? -result : result; } 

рдкрд░рд┐рдгрд╛рдо:
MyConvertTest: 05.2410683 рд╕реЗрдХрдВрдб
рдпрд╣ рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ ~ 39% рддреЗрдЬ рд╣реИ (рдФрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдХреЗрд╡рд▓ 3% рддреЗрдЬ)ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдмреЗрд╢рдХ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреА рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдореИрдВ рдПрдХ рднреА рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рд╣реЛред рдлрд┐рд░ рднреА, рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд┐рд╖реНрдХрд░реНрд╖ рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдЕрдХреНрд╕рд░ рдХрд╛рдлреА рдирд┐рд╖реНрдкрдХреНрд╖ рдХрдерди рд╣реИрдВ рдХрд┐ рд╕рднреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрдиреБрдХреВрд▓рди рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд╛рдлреА рдмреБрджреНрдзрд┐рдорд╛рди рд╣реИрдВ рдФрд░ рдЦреБрдж рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдЪрдХреНрд░реЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреИрдирд╛рддреА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрддрд┐ рдореЗрдВ 20 рдкреНрд░рддрд┐рд╢рдд рд╡реГрджреНрдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдпрджрд┐ рдЖрдк 1 рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ)ред

рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рд╣рдореЗрд╢рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдорд░реНрдерди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХреБрдЫ рд╕реЗрдХрдВрдб рддрдХ рдХрд╛рдо рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рд╕реЗ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

UPD рдиреЗ рдкреНрд▓рд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛, рдзрдиреНрдпрд╡рд╛рджред
UPD 2 it4_kp рдиреЗ рд╕рд╣реА рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
 MyConvert.ToInt( int.MinValue.ToString() ) 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, int.MinValue modulo int.MaxValue рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛ рдореЗрдВ рдЗрдВрдЯ рд╕реЗ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕реАрдорд╛ рдмрдлрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, int.MinValue рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдПрдХ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди: рдордзреНрдпрд╡рд░реНрддреА рдмрдлрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  unsafe public static int ToInt(string s) { .... result = result * 10 - (ch - '0'); ..... return (isNegative) ? result : checked(-result); } 


рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрджрд┐рдо рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░рдгред

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


All Articles