Что лучше использовать: Convert.ToX или X.Parse (...)? - PullRequest
6 голосов
/ 12 мая 2011

Я использую отражение для создания некоторых объектов.Значения, которые я устанавливаю, считываются из файла, поэтому они изначально имеют строковый формат, и мне нужно преобразовать их в тип данных свойства.

У меня вопрос, который быстрее / лучшеиспользовать: Convert.ToX(...) методы или X.Parse(...) методы?

Ответы [ 5 ]

11 голосов
/ 12 мая 2011

Все функции Convert.ToX, которые принимают аргумент типа string, в конечном итоге все равно вызывают метод Parse соответствующего типа данных.

Например, Convert.ToInt32(string) выглядит примерно так:

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

То же самое для всех других методов преобразования чисел, включая Decimal и DateTime. Так что это не имеет значения, какой вы используете; результат (и скорость) будут одинаковыми в любом случае.

Действительно, единственным отличием является пункт if (value == null) в начале. Будет ли это удобно, зависит от конкретного случая использования. Как правило, если вы знаете, что у вас есть ненулевой объект string, вы также можете использовать Parse. Если вы не уверены, ConvertToX - более безопасная ставка, требующая меньше встроенного кода с нулевой проверкой.

1 голос
/ 12 мая 2011

Другая возможность - TryParse методы.Это особенно полезно, если есть вероятность, что значение не может быть успешно проанализировано.Вместо генерации исключения вызов вернет bool, указывающий, была ли операция успешной.Это выполняется намного быстрее и является более чистой реализацией по сравнению с обработкой исключения.

1 голос
/ 12 мая 2011

Согласно тому, что я вижу в Reflector, строка формы Convert является оберткой вокруг Parse.поэтому вполне понятно, что использование синтаксического разбора незначительно лучше по производительности.

РЕДАКТИРОВАТЬ: после того, как Коди указал, что оптимизация почти ничего не изменит, я проверил на своей машине, и действительно, время выполнения для Parse и Convert оказалось одинаковым при анализе 1 миллиона inetgers вцикл.

EDIT2: вот вам yas4891, на самом деле это код, который вы использовали с очень незначительными изменениями.

public static void Main()
        {
            int tRuns = 1000000;
            List<String> tList = new List<string>();
            for (int i = 0; i < tRuns; i++) tList.Add(i.ToString());
            Stopwatch s = new Stopwatch();
            s.Start();
            int tSum = 0;
            for (int i = tRuns - 1; i >= 0; i--) 
            {
                tSum += Convert.ToInt32(tList[i]);
            }
            s.Stop();
            Console.WriteLine("convert: " + s.ElapsedMilliseconds);

            Console.WriteLine("tSum:" + tSum); 

            s.Reset();
            s.Start();
            tSum = 0; 
            for (int i = tRuns - 1; i >= 0; i--) 
            { 
                tSum += Int32.Parse(tList[i]); 
            } 
            s.Stop();
            Console.WriteLine("parse: " + s.ElapsedMilliseconds);
            Console.WriteLine("tSum:" + tSum);
            Console.ReadKey();
        }
1 голос
/ 12 мая 2011

Они точно такие же!Методы Convert.ToX(String) фактически вызывают методы X.Parse(String).

0 голосов
/ 12 мая 2011

используя следующий код

int tRuns = 1000000;
List<String> tList = new List<string>();

for (int i = 0; i < tRuns; i++)
   tList.Add(i.ToString());


PerformanceMeter.Start();
int tSum = 0;
for (int i = tRuns-1; i >= 0; i--)
{
   tSum += Convert.ToInt32(tList[i]);
}

PerformanceMeter.LogAndStop("using Convert.ToInt32:");

cLogger.Info("tSum:" + tSum);
PerformanceMeter.Start();

tSum = 0;
for (int i = tRuns-1; i >= 0; i--)
{
   tSum += Int32.Parse(tList[i]);
}

PerformanceMeter.LogAndStop("using Int32.Parse:");
cLogger.Info("tSum:" + tSum);

дает мне следующий вывод:

{PerformanceMeter}: 178 ИНФОРМАЦИЯ: - с использованием Convert.ToInt32 :: 233 0133 мс
{Program}: 92 INFO: - tSum: 1783293664
{PerformanceMeter}: 178 ИНФОРМАЦИЯ: - используя Int32.Parse :: 179 0103 мс
{Program}: 102 INFO: - tSum: 1783293664

Так что, по крайней мере для Int32, кажется более эффективным использовать Int32.Parse. Однако в вашем сценарии это может отличаться, и я полагаю, вам следует провести аналогичный тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...