Двойной.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) ?
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 быстрее, потому что он не должен иметь дело со всей трассировкой стека исключений.
Я вообще стараюсь избегать
ToString метод числовых классов не предлагает соответствующего метода для этого).Convertкласс (значение: я не использую его), потому что я нахожу это очень запутанным: код дает слишком мало подсказок о том, что именно происходит здесь сConvertпозволяет выполнять множество семантически очень разных преобразований с одним и тем же кодом. Это делает его трудно контролировать для программиста, что именно происходит.
Если вы не на 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