在Convert.ChangeType或Convert.ToInt32或int.Parse
之间是否有任何性能优势答案 0 :(得分:8)
如果您知道自己要将string
转换为Int32
,那么使用Convert.ChangeType
似乎是一种模糊的方式。我肯定更喜欢其他任何一种电话。
int.Parse
和Convert.ToInt32(x)
之间的主要区别在于Convert.ToInt32(null)
返回0,而int.Parse(null)
将引发异常。当然,int.Parse
还可以让您更好地控制使用何种文化。
我非常怀疑一个人对另一个人有任何性能上的好处:我会期待 Convert.ToInt32
来呼叫int.Parse
而不是反过来 - 但它不是记录以这种方式工作,并且单个方法调用的命中不太可能是重要的。 (无论如何,它可能会被内联。)
答案 1 :(得分:5)
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);
}
这个简单的测试结果是
266 on CalcChangeTypePerf
167 on CalcToInt32Perf
165 on CalcIntParse
答案 2 :(得分:0)
是
Convert.ToInt32比使用Convert.ChangeType更好。
ChangeType是一种通用转换方法,它将value指定的对象转换为conversionType。 ToInt32特定于int32类型。
答案 3 :(得分:0)
简单测试显示Parse()
是最快的方法,下一个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();
}
结果是:
ChangeType=2422
ToInt32=1859
Parse=1760
ChangeType=2374
ToInt32=1857
Parse=1762
ChangeType=2378
ToInt32=1860
Parse=1763
ChangeType=2375
ToInt32=1855
Parse=1759