int.Parse()和Convert.ToInt()之间有性能差异吗?

30

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

string stringInt = "01234";

int iParse = int.Parse(stringInt);

int iConvert = Convert.ToInt32(stringInt);

我发现一个问题,询问强制转换与转换之间的区别,但我认为这是不同的,对吗?


这有所不同,是的。 - Ken Browning
我也很想了解这个。 - dance2die
哦,我没能找出这两者之间是否有显著的性能差异! - dance2die
7个回答

42
当传入一个字符串作为参数时,Convert.ToInt32 内部会调用 int.Parse。所以唯一的区别就是多了一个空值检查。
这是来自 .NET Reflector 的代码。
public static int ToInt32(string value)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, CultureInfo.CurrentCulture);
}

问题要求比较“性能”。那么,“null check”会产生任何性能损失吗? - dance2die
3
宋:当然。空值检查是另一个必须执行的操作。虽然它可能非常小,但会导致性能下降。 - configurator

17

就这样而言:

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

    }
}

每个测试迭代一百万次的结果:

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

正是我所需要的!恭喜达成1万 :) - Elliott

1
我写了下面的代码,结果发现 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);
    }

这怎么可能呢,或许99999999是一个太小的数字,无法得到有效的结果。 - nawfal

1

正如其他人所提到的,这里有一些性能方面的问题。如果您查看测试代码和性能统计数据从此网站获得, 您会发现:

  • 在进行大量转换时,Int.Parse() 和 Int.TryParse() 通常执行得更快。
  • Convert.ToInt() 在少量转换时似乎表现最佳
  • 不考虑异常情况,将字符串转换为整数的最快方法不受您需要执行的转换数量限制:

_

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

1
那真的很有教育意义。有关ParseInt32和int.Parse源代码,请参阅此处:http://referencesource.microsoft.com/#mscorlib/system/number.cs,04291cc3a0b10032 - user3638471

1

两者之间的差别在于对待NULL值的方式。

当遇到NULL值时,Convert.ToInt32会返回0。 而Parse更为敏感,需要一个有效的值。因此,如果你传入了一个NULL,它会抛出异常。


1

请参阅此讨论以获取详细信息。

Convert.ToInt32不会经常抛出异常(如果stringInt == null,则返回0而不是抛出异常),但由于它执行了一些额外的检查,然后在内部调用int.Parse,因此具有稍微更多的开销。


0

它们两个都很慢。如果你知道输入字符串的确切格式并且关心速度,我建议你自己编写转换函数。


你的回答可以通过提供更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便其他人可以确认您的答案是否正确。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接