将对象转换为双倍的最快方法?

cod*_*ife 17 c# performance .net-3.5

将对象转换为double的最快方法是什么?我现在正处于一段代码中,其中包括:

var d = double.TryParse(o.ToString(), out d);  // o is the Object...
Run Code Online (Sandbox Code Playgroud)

首先想到的是将其重写为

var d = Convert.ToDouble(o);
Run Code Online (Sandbox Code Playgroud)

但实际上会更快吗?

编辑: 除了运行配置文件(顺便说一下,我强烈建议任何开发人员使用JetBrains dotTrace),我运行了Reflector,这帮助我提出了以下内容(或多或少相关的代码部分):

if (o is IConvertible)
{
    d = ((IConvertible)o).ToDouble(null);
}
else
{
    d = 0d;
}
Run Code Online (Sandbox Code Playgroud)

原始代码double.TryParse()在140ms内执行.新代码在34ms内执行.我几乎可以肯定这是我应该采取的优化路径,但在我这样做之前,有没有人看到我的"优化"代码出现问题?在此先感谢您的反馈!

Flo*_*ory 19

你必须做很多这些,以便有任何意义,花时间在这上面.但是,我不是来判断:

所以,你的代码是这样的:

if (o is IConvertible)
{
    d = ((IConvertible)o).ToDouble(null);
}
else
{
    d = 0d;
}
Run Code Online (Sandbox Code Playgroud)

我想知道你是否会更好

IConvertible convert = o as IConvertible;

if (convert != null)
{
  d = convert.ToDouble(null);
}
else
{
  d = 0d;
}
Run Code Online (Sandbox Code Playgroud)

为您节省双重演员.

  • d = o 是 IConvertible 值吗?value.ToDouble(null) : 0d; 对于单行者 (2认同)

Bri*_*eon 10

我尝试了以下方法.

  • 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();
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,我看到了这些结果.我平均进行了3次不同的跑步.

  • double.TryParse = 4.45秒
  • double.Parse = 4.45秒
  • Convert.ToDouble = 4.75秒

当然,我使用了可转换的字符串.如果字符串不可转换,那么我高度怀疑是远远double.TryParse的最快.