Самый быстрый путь к преобразованию объекта удвоиться?

Что самый быстрый путь состоит в том, чтобы преобразовать объект в двойное? Я в части кода прямо сейчас, который читает:

var d = double.TryParse(o.ToString(), out d);  // o is the Object...

Первые мысли состояли в том, чтобы переписать это как

var d = Convert.ToDouble(o);

но это на самом деле было бы быстрее?

Править: В дополнение к выполнению профиля (между прочим, я настоятельно рекомендую JetBrains dotTrace любому разработчику), я выполнил Отражатель, и это помогло мне придумать следующее (более или менее соответствующая часть кода):

if (o is IConvertible)
{
    d = ((IConvertible)o).ToDouble(null);
}
else
{
    d = 0d;
}

Исходный код double.TryParse() выполняемый в 140 мс. Новый код выполняется в 34 мс. Я почти уверен, что это - путь оптимизации, который я должен взять, но прежде чем я сделаю это, кто-либо видит что-либо проблематичное с моим "оптимизированным" кодом? Заранее спасибо за Вашу обратную связь!

17
задан code4life 16 December 2015 в 15:34
поделиться

4 ответа

Вы, должно быть, делаете целую колоссальную массу этих работ, чтобы иметь смысл тратить на это какое-то время. Однако я здесь не для того, чтобы судить:

Итак, ваш код таков:

if (o is IConvertible)
{
    d = ((IConvertible)o).ToDouble(null);
}
else
{
    d = 0d;
}

Интересно, будет ли вам лучше с этим

IConvertible convert = o as IConvertible;

if (convert != null)
{
  d = convert.ToDouble(null);
}
else
{
  d = 0d;
}

Спасает вас от двойного заброса.

19
ответ дан 30 November 2019 в 12:06
поделиться

Я попробовал следующие методы.

  • double.TryParse
  • double.Parse
  • Convert.ToDouble

Я использовал следующий код.

public static void Main()
{
    string text = "3.14";
    var timer = new Stopwatch();
    timer.Start();
    for (int i = 0; i < 10000000; i++)
    {
        double d;
        d = Convert.ToDouble(text);
        //double.TryParse(text, out d);
        //d = double.Parse(text);
    }
    timer.Stop();
    Console.WriteLine("Time=" + timer.Elapsed.ToString());
    Console.ReadLine();
}

На моей машине я увидел следующие результаты. Я усреднил 3 разных прогона.

  • double.TryParse = 4.45 секунды
  • double.Parse = 4.45 секунды
  • Convert.ToDouble = 4.75 секунды

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

10
ответ дан 30 November 2019 в 12:06
поделиться

Создайте небольшое тестовое приложение с помощью System.Diagnostics.Stopwatch и посмотрите, какое из них окажется быстрее. Хотя я бы сказал, что это не имеет большого значения. Я бы выбрал Convert.ToDouble исключительно для удобства чтения.

3
ответ дан 30 November 2019 в 12:06
поделиться

Во-первых, если вы действительно хотите узнать, что быстрее, вам следует написать быстрый тест (используя данные, которые вы ожидаете обрабатывать) и время для каждой опции. Не зная, что такое o (или, вероятно, будет), очень трудно судить. Я подозреваю, что вы не увидите большой разницы.

Во-вторых, я сомневаюсь, что это действительно имеет значение, если вы не вызываете этот фрагмент кода в чрезвычайно критичной по времени части кода и не вызываете его тысячу раз для загрузки. Напишите хороший, чистый код, затем оптимизируйте.

1
ответ дан 30 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: