int.Parse()和Convert.Toint()之间的任何性能差异?

将字符串转换为int.Parse()和Convert.ToInt32()之间的整数值有什么重大优势吗?

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

我发现了一个关于转换vs转换的问题,但我认为这是不同的,对吧?

当传递一个字符串作为参数时,Convert.ToInt32在内部调用int.Parse。 所以唯一的区别是额外的空检查。

这是.NET Reflector的代码

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

物有所值:

 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); } } } } 

每个1,000,000次迭代的结果:

 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 

区别在于两者处理NULL值的方式。

当遇到NULL值时,Convert.ToInt32返回值0.另一方面,Parse更敏感并期望有效值。 因此,当您传入NULL时会抛出exception。

有关详细信息,请参阅此讨

Convert.ToInt32不会经常抛出(如果stringInt == null,它返回0而不是抛出exception),但由于它正在做一些额外的检查,然后在内部调用int.Parse,因此会有一点点开销。

我编写了下面的代码,结果是int.parse比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); } 

其他人提到了一些性能影响。 如果您查看本网站的测试代码和性能统计数据:

  • Int.Parse()和Int.TryParse()通常会随着您执行的转换次数的增加而执行得更快。
  • Convert.ToInt()似乎在转换次数较少时表现最佳
  • 无论您需要执行多少次转换,将字符串转换为int(假设没有例外)的总体最快方法是:

_

 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');