Двойной.TryParse или конвертировать.ToDouble - что быстрее и безопаснее?



мое приложение читает файл Excel с помощью VSTO и добавляет прочитанные данные в StringDictionary. Он добавляет только данные, которые являются числами с несколькими цифрами (1000 1000,2 1000,34 - запятая является разделителем в российских стандартах).



что лучше проверить, если текущая строка является соответствующим числом?



object data, string key; // data had read

try
{
Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
dic.Add(key, regionData.ToString());
}
catch (InvalidCastException)
{
// is not a number
}


или



double d;
string str = data.ToString();
if (Double.TryParse(str, out d)) // if done, then is a number
{
dic.Add(key, str);
}


Я должен использовать StringDictionary вместо Dictionary<string, double> из-за следующих проблем алгоритма разбора.



мои вопросы: в какую сторону это быстрее? Что безопаснее?



а лучше позвонить Convert.ToDouble(object) или Convert.ToDouble(string) ?

785   10  

10 ответов:

Я сделал быстрый ненаучный тест в режиме релиза. Я использовал два входа:" 2.34523 "и" badinput " в оба метода и повторил 1 000 000 раз.

допустимые значения:

Double.TryParse = 646ms
Convert.ToDouble = 662 ms

не сильно отличается, как и ожидалось. Для всех намерений и целей, для действительного ввода, они одинаковы.

неверный ввод:

Double.TryParse = 612ms
Convert.ToDouble = ..

хорошо.. он работал в течение длительного времени. Я повторяю все это, используя 1000 итераций и Convert.ToDouble С плохим входом взял 8.3 считанные секунды. В среднем, это займет более 2 часов. Мне все равно, насколько прост тест, в случае недопустимого ввода,Convert.ToDoubleисключение повышение разрушит вашу производительность.

Итак, вот еще один голос за TryParse С некоторыми номерами, чтобы поддержать его.

для начала, я бы использовал double.Parse, а не Convert.ToDouble в первую очередь.

о том, следует ли использовать Parse или TryParse: можете ли вы продолжить, если есть плохие входные данные, или это действительно исключительное условие? Если это исключительный, используйте Parse и пусть он взорвется, если вход плохой. Если это ожидается и может быть чисто обработано, используйте TryParse.

Если вы не собираетесь обрабатывать исключение идти с TryParse. TryParse быстрее, потому что он не должен иметь дело со всей трассировкой стека исключений.

Я вообще стараюсь избегать Convert класс (значение: я не использую его), потому что я нахожу это очень запутанным: код дает слишком мало подсказок о том, что именно происходит здесь с Convert позволяет выполнять множество семантически очень разных преобразований с одним и тем же кодом. Это делает его трудно контролировать для программиста, что именно происходит.

ToString метод числовых классов не предлагает соответствующего метода для этого).

Если вы не на 100% уверены в своих входах, что редко бывает, вы должны использовать Double.Метод tryparse.

Convert.ToDouble will throw an exception on non-numbers
Double.Parse will throw an exception on non-numbers or null
Double.TryParse will return false or 0 on any of the above without generating an exception.

скорость разбора становится вторичной, когда вы бросаете исключение, потому что там не намного медленнее, чем исключение.

в руководстве по проектированию .NET Framework рекомендуется использовать методы Try. Избегать исключений, как правило, хорошая идея.

Convert.ToDouble(object) сделает ((IConvertible) object).ToDouble(null);

который вызовет Convert.ToDouble(string, null)

так что это быстрее, чтобы вызвать строку версии.

однако строковая версия просто делает это:

if (value == null)
{
    return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);

так что это быстрее сделать double.Parse напрямую.

много ненависти для класса Convert здесь... Просто чтобы немного уравновесить, есть одно преимущество для преобразования - если вам передали объект,

Convert.ToDouble(o);

может просто вернуть значение легко, если o уже является двойным (или int или что-то легко кастуемое).

С Помощью Double.Разобрать или удвоить.TryParse отлично подходит, если у вас уже есть в строке, но

Double.Parse(o.ToString());

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

двойной.Метод tryparse ИМО.

Это проще для вас, чтобы справиться, Вы будете точно знать, где произошла ошибка.

тогда вы можете иметь дело с ним, как вы считаете нужным, если он возвращает false (т. е. не может конвертировать).

Я всегда предпочитал использовать TryParse() методы, потому что он будет плевать на успех или неудачу преобразования, не беспокоясь об исключениях.

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

Я ожидал бы TryParse чтобы быть быстрее, так как это позволяет избежать накладных расходов на обработку исключений. Но используйте тестовый инструмент, например мини-верстак Джона Скита для сравнения различных возможности.

Comments

    Ничего не найдено.