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