Подтвердить что ты не робот

Любая разница в производительности между int.Parse() и Convert.Toint()?

Есть ли существенные преимущества для преобразования строки в целочисленное значение между int.Parse() и Convert.ToInt32()?

string stringInt = "01234";

int iParse = int.Parse(stringInt);

int iConvert = Convert.ToInt32(stringInt);

Я нашел question вопрос о кастинге против Конвертировать, но я думаю, что это другое, не так ли?

4b9b3361

Ответ 1

При передаче строки в качестве параметра Convert.ToInt32 вызывает int.Parse внутренне. Таким образом, единственная разница - это дополнительная проверка нуля.

Здесь код из .NET Reflector

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

Ответ 2

Для чего стоит:

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

Ответ 3

Разница заключается в том, как обе обрабатывают значение NULL.

Когда встречается значение NULL, Convert.ToInt32 возвращает значение 0. С другой стороны, Parse более чувствителен и ожидает действительного значения. Таким образом, это будет выдавать исключение, когда вы передаете NULL.

Ответ 4

Подробнее см. .

Convert.ToInt32 не будет бросать так часто (если stringInt == null, он возвращает 0 вместо того, чтобы бросать исключение), но имеет немного больше накладных расходов, так как он выполняет несколько дополнительных проверок, а затем вызывает int.Parse внутренне.

Ответ 5

Я написал код ниже, и результатом было то, что 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);
    }

Ответ 6

Есть некоторые последствия для производительности, о которых говорили другие. Если вы посмотрите на тестовый код и статистику производительности с этого веб-сайта:

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