¿Hay alguna ventajas de rendimiento de una sobre otra entre Convert.ChangeType o Convert.ToInt32 o int.Parse¿Cuál es la principal diferencia entre Convert.ChangeType o Convert.ToInt32?
Respuesta
Si sabe que va a ser la conversión de un string
a Int32
, utilizando Convert.ChangeType
parece una manera oscura de hacer ese. Definitivamente preferiría cualquiera de las otras llamadas a eso.
La principal diferencia entre int.Parse
y Convert.ToInt32(x)
es que Convert.ToInt32(null)
devuelve 0 en tanto que int.Parse(null)
se producirá una excepción. Por supuesto, int.Parse
también le da más control en términos de qué cultura se utiliza.
dudo mucho que haya ninguna ventaja de rendimiento de una sobre la otra: Me esperarConvert.ToInt32
para llamar int.Parse
en lugar de a la inversa - pero no es documentado a trabajar de esa manera, y el golpe de es poco probable que una llamada a un solo método sea significativa. (De todos modos, puede estar subrayado.)
Tanto Convert.ToInt32() como Int32.Parse() usan el método (no disponible públicamente) System.Number.ParseInt32() que a su vez invoca System.Number.StringToNumber(). ¿Cómo sé esto? Mira el rastro de la pila de la FormatException que se genera al pasar una cadena no válida :-) –
@ user532870: Es suficiente, pero aún así no confiaría en ese tipo de cosas :) –
@ user532870: Jon tiene razón. La reflexión muestra que Convert.ToInt32 llama a int.Parse que llama a Number.ParseInt32. @Jon: Entonces int.Parse es mejor? – naveen
Sí.
Convert.ToInt32 es mejor que usar Convert.ChangeType para el mismo propósito.
ChangeType es un método de conversión de propósito general que convierte el objeto especificado por valor en conversionType. Mientras que ToInt32 es específico para tipo int32.
De hecho, 'ChangeType()' es programático 'cast', mientras tanto' Convert.ToInt32() 'realmente crea' int' de otro tipo – abatishchev
private const int maxValue = 1000000;
static void Main(string[] args)
{
string[] strArray = new string[maxValue];
for (int i = 0; i < maxValue; i++)
{
strArray[i] = i.ToString();
}
int[] parsedNums = new int[maxValue];
CalcChangeTypePerf(strArray,parsedNums);
CalcToInt32Perf(strArray, parsedNums);
CalcIntParse(strArray, parsedNums);
}
public static void CalcChangeTypePerf(string[] strArray,int[] parsedArray)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < maxValue; i++)
{
parsedArray[i] = (int)Convert.ChangeType(strArray[i], typeof(int));
}
stopwatch.Stop();
Console.WriteLine("{0} on CalcChangeTypePerf", stopwatch.ElapsedMilliseconds);
}
public static void CalcToInt32Perf(string[] strArray, int[] parsedArray)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < maxValue; i++)
{
parsedArray[i] = Convert.ToInt32(strArray[i]);
}
stopwatch.Stop();
Console.WriteLine("{0} on CalcToInt32Perf", stopwatch.ElapsedMilliseconds);
}
public static void CalcIntParse(string[] strArray, int[] parsedArray)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < maxValue; i++)
{
parsedArray[i] = int.Parse(strArray[i]);
}
stopwatch.Stop();
Console.WriteLine("{0} on CalcIntParse", stopwatch.ElapsedMilliseconds);
}
Este sencillo resultados de las pruebas de este
266 on CalcChangeTypePerf
167 on CalcToInt32Perf
165 on CalcIntParse
Está creando un millón de objetos en cada prueba, innecesariamente. Si bien cada prueba es "igual" de esa manera, significa que las diferencias relativas en el tiempo * de análisis * real se enmascaran un tanto, y puede haber recolección de basura dentro de una prueba, limpiando la basura de otra. Te sugiero que crees una serie de cadenas * una vez * al inicio y lo vuelvas a usar. –
Corregido Jon, tienes razón, los tiempos son muy diferentes ... –
prueba simple muestra es Parse()
método más rápido, la próxima y última Convert.ToInt32()
Convert.ChangeType()
:
static void Main(string[] args)
{
string s = "104563";
int a = 1;
for (int k = 0; k < 4; k++)
{
Stopwatch w = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
a = (int)Convert.ChangeType(s, typeof(int));
w.Stop();
Console.WriteLine("ChangeType={0}", w.ElapsedMilliseconds);
Stopwatch w1 = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
a = Convert.ToInt32(s);
w1.Stop();
Console.WriteLine("ToInt32={0}", w1.ElapsedMilliseconds);
Stopwatch w2 = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
a = Int32.Parse(s);
w2.Stop();
Console.WriteLine("Parse={0}", w2.ElapsedMilliseconds);
}
Console.ReadLine();
}
El resultado es:
ChangeType=2422
ToInt32=1859
Parse=1760
ChangeType=2374
ToInt32=1857
Parse=1762
ChangeType=2378
ToInt32=1860
Parse=1763
ChangeType=2375
ToInt32=1855
Parse=1759
- 1. ¿Cuál es la principal diferencia entre pepino y shoulda?
- 2. ¿Cuál es la diferencia entre una clave principal e identidad?
- 3. Cuál es la diferencia principal entre Dictionary y Hashtable
- 4. ¿Cuál es la principal diferencia entre ReadOnly y Enabled?
- 5. ¿Cuál es la principal diferencia entre signcode.exe y signtool.exe?
- 6. ¿Cuál es la diferencia entre XAMPP o WAMP Server & IIS?
- 7. ¿Cuál es la diferencia entre System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator?
- 8. ¿Cuál es la diferencia entre '\ n' o "\ n" en C++?
- 9. ¿Cuál es la diferencia entre Convert y Parse?
- 10. ¿Cuál es la diferencia entre dict() y {}?
- 11. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 12. ¿Cuál es la diferencia entre el
- 13. ¿Cuál es la diferencia entre {0} y ""?
- 14. Cuál es la diferencia entre = y: =
- 15. ¿Cuál es la diferencia entre codificar/decodificar?
- 16. ¿Cuál es la diferencia entre .ToString (+) y ""
- 17. ¿Cuál es la diferencia entre esos dos?
- 18. Cuál es la diferencia entre $ (...) y `...`
- 19. ¿Cuál es la diferencia entre() vs [] vs {}?
- 20. ¿Cuál es la diferencia entre window.innerWidth window.outerWidth?
- 21. ¿cuál es la diferencia entre:.! y: r !?
- 22. ¿Cuál es la diferencia entre ".equals" y "=="?
- 23. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 24. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 25. ¿Cuál es la diferencia entre + = y = +?
- 26. ¿Cuál es la diferencia entre estas funciones?
- 27. ¿Cuál es la diferencia entre applicationDidReceiveMemoryWarning, didReceiveMemoryWarning?
- 28. ¿Cuál es la diferencia entre " " y ""?
- 29. ¿Cuál es la diferencia entre Response.Write() andResponse.Output.Write()?
- 30. Cuál es la diferencia entre $ y jQuery
No te olvides de 'Int32.TryParse (String, out int)' que ofrece algunas buenas posibilidades. – basti