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.