Что самый быстрый путь состоит в том, чтобы преобразовать объект в двойное? Я в части кода прямо сейчас, который читает:
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 мс. Я почти уверен, что это - путь оптимизации, который я должен взять, но прежде чем я сделаю это, кто-либо видит что-либо проблематичное с моим "оптимизированным" кодом? Заранее спасибо за Вашу обратную связь!
Вы, должно быть, делаете целую колоссальную массу этих работ, чтобы иметь смысл тратить на это какое-то время. Однако я здесь не для того, чтобы судить:
Итак, ваш код таков:
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;
}
Спасает вас от двойного заброса.
Я попробовал следующие методы.
Я использовал следующий код.
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
будет самым быстрым.
Создайте небольшое тестовое приложение с помощью System.Diagnostics.Stopwatch и посмотрите, какое из них окажется быстрее. Хотя я бы сказал, что это не имеет большого значения. Я бы выбрал Convert.ToDouble
исключительно для удобства чтения.
Во-первых, если вы действительно хотите узнать, что быстрее, вам следует написать быстрый тест (используя данные, которые вы ожидаете обрабатывать) и время для каждой опции. Не зная, что такое o
(или, вероятно, будет), очень трудно судить. Я подозреваю, что вы не увидите большой разницы.
Во-вторых, я сомневаюсь, что это действительно имеет значение, если вы не вызываете этот фрагмент кода в чрезвычайно критичной по времени части кода и не вызываете его тысячу раз для загрузки. Напишите хороший, чистый код, затем оптимизируйте.