unity toint32 tipo sirve que parse para convertir convert c# performance

toint32 - string to int 32 c#



¿Alguna diferencia de rendimiento entre int.Parse() y Convert.Toint()? (6)

Cuando se pasa una cadena como parámetro, Convert.ToInt32 llama a int.Parse internamente. Así que la única diferencia es un cheque nulo adicional.

Aquí está el código de .NET Reflector

public static int ToInt32(string value) { if (value == null) { return 0; } return int.Parse(value, CultureInfo.CurrentCulture); }

¿Hay alguna ventaja significativa para convertir una cadena en un valor entero entre int.Parse () y Convert.ToInt32 ()?

string stringInt = "01234"; int iParse = int.Parse(stringInt); int iConvert = Convert.ToInt32(stringInt);

Encontré una question sobre el casting vs Convert, pero creo que esto es diferente, ¿verdad?


Escribí el siguiente código y el resultado fue que int.parse es más lento que convert.toint32.

static void Main(string[] args) { Console.WriteLine(TimeConvertTo()); Console.WriteLine(TimeParse()); } static TimeSpan TimeConvertTo() { TimeSpan start = DateTime.Now.TimeOfDay; for (int i = 0; i < 99999999; i++) { Convert.ToInt32("01234"); } return DateTime.Now.TimeOfDay.Subtract(start); } static TimeSpan TimeParse() { TimeSpan start = DateTime.Now.TimeOfDay; for (int i = 0; i < 99999999; i++) { int.Parse("01234"); } return DateTime.Now.TimeOfDay.Subtract(start); }


Hay algunas implicaciones de rendimiento como otros han mencionado. Si observa el código de prueba y las estadísticas de rendimiento de este sitio web :

  • Int.Parse () e Int.TryParse () generalmente funcionan más rápido a medida que aumenta el número de conversiones que está realizando.
  • Convert.ToInt () parece funcionar mejor con un bajo número de conversiones
  • La forma más rápida en general de convertir una cadena a un int (asumiendo que no hay excepciones) independientemente del número de conversiones que necesita realizar es:

_

y = 0; //the resulting number from the conversion //loop through every char in the string, summing up the values for the final number for (int i = 0; i < s[x].Length; i++) y = y * 10 + (s[x][i] - ''0'');


La diferencia radica en la forma en que ambos maneja el valor NULL.

Cuando se encuentra un valor NULL, Convert.ToInt32 devuelve un valor 0. Por otra parte, Parse es más sensible y espera un valor válido. Así que lanzaría una excepción cuando pasas un NULL.


Por lo que vale:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int iterations = 1000000; string val = "01234"; Console.Write("Run 1: int.Parse() "); DateTime start = DateTime.Now; DoParse(iterations, val); TimeSpan duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToString() + "ms"); Console.Write("Run 1: Convert.ToInt32() "); start = DateTime.Now; DoConvert(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToString() + "ms"); Console.Write("Run 2: int.Parse() "); start = DateTime.Now; DoParse(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToString() + "ms"); Console.Write("Run 2: Convert.ToInt32() "); start = DateTime.Now; DoConvert(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToString() + "ms"); Console.Write("Run 3: int.Parse() "); start = DateTime.Now; DoParse(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToString() + "ms"); Console.Write("Run 3: Convert.ToInt32() "); start = DateTime.Now; DoConvert(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToString() + "ms"); Console.ReadKey(); } static void DoParse(int iterations, string val) { int x; for (int i = 0; i < iterations; i++) { x = int.Parse(val); } } static void DoConvert(int iterations, string val) { int x; for (int i = 0; i < iterations; i++) { x = Convert.ToInt32(val); } } } }

Resultado de 1,000,000 iteraciones de cada uno:

Run 1: int.Parse() Duration: 312.5ms Run 1: Convert.ToInt32() Duration: 328.125ms Run 2: int.Parse() Duration: 296.875ms Run 2: Convert.ToInt32() Duration: 312.5ms Run 3: int.Parse() Duration: 312.5ms Run 3: Convert.ToInt32() Duration: 312.5ms


Vea esta discusión para más detalles.

Convert.ToInt32 no lanzará tan a menudo (si stringInt == null, devuelve 0 en lugar de lanzar una excepción), pero tiene un poco más de sobrecarga ya que está haciendo algunas verificaciones adicionales y luego llama int.Parse internamente.