Toute différence de performance entre int.Parse () et Convert.Toint ()?

Existe-t-il des avantages importants à convertir une chaîne en une valeur entière comprise entre int.Parse () et Convert.ToInt32 ()?

ssortingng ssortingngInt = "01234"; int iParse = int.Parse(ssortingngInt); int iConvert = Convert.ToInt32(ssortingngInt); 

J’ai trouvé une question sur le casting vs Convert mais je pense que c’est différent, non?

Lorsqu’une chaîne est transmise en tant que paramètre, Convert.ToInt32 appelle int.Parse en interne. Donc, la seule différence est un contrôle nul supplémentaire.

Voici le code de .NET Reflector

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

Pour ce que ça vaut:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(ssortingng[] args) { int iterations = 1000000; ssortingng 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.ToSsortingng() + "ms"); Console.Write("Run 1: Convert.ToInt32() "); start = DateTime.Now; DoConvert(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToSsortingng() + "ms"); Console.Write("Run 2: int.Parse() "); start = DateTime.Now; DoParse(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToSsortingng() + "ms"); Console.Write("Run 2: Convert.ToInt32() "); start = DateTime.Now; DoConvert(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToSsortingng() + "ms"); Console.Write("Run 3: int.Parse() "); start = DateTime.Now; DoParse(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToSsortingng() + "ms"); Console.Write("Run 3: Convert.ToInt32() "); start = DateTime.Now; DoConvert(iterations, val); duration = DateTime.Now - start; Console.WriteLine("Duration: " + duration.TotalMilliseconds.ToSsortingng() + "ms"); Console.ReadKey(); } static void DoParse(int iterations, ssortingng 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); } } } } 

Résultat de 1 000 000 itérations de chacune:

 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 

La différence réside dans la manière dont les deux gèrent la valeur NULL.

Lorsqu’une valeur NULL est détectée, Convert.ToInt32 renvoie la valeur 0. Par contre, Parse est plus sensible et attend une valeur valide. Donc, il lève une exception lorsque vous transmettez une valeur NULL.

Voir cette discussion pour plus de détails.

Convert.ToInt32 ne lancera pas aussi souvent (si ssortingngInt == null, il renvoie 0 au lieu de générer une exception), mais a un peu plus de temps système puisqu’il effectue quelques vérifications supplémentaires, puis appelle int.Parse en interne.

J’ai écrit le code ci-dessous et le résultat est que int.parse est plus lent que convert.toint32.

  static void Main(ssortingng[] 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); } 

Certaines performances ont des implications, comme d’autres l’ont mentionné. Si vous consultez le code de test et les statistiques de performance de ce site Web :

  • Int.Parse () et Int.TryParse () fonctionnent généralement plus rapidement à mesure que le nombre de conversions que vous effectuez augmente.
  • Convert.ToInt () semble fonctionner mieux avec un faible nombre de conversions
  • Le moyen le plus rapide de convertir une chaîne en un entier (sans exception), quel que soit le nombre de conversions à effectuer, est le suivant:

_

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