其中哪些在性能方面更好?

时间:2010-01-18 17:34:34

标签: c# performance

这两个陈述有什么区别?哪个在性能方面更好?

Console.Writeline(i);
Console.Writeline(i.toString());

其中i是字符串或整数。

4 个答案:

答案 0 :(得分:14)

最重要的是,写入控制台必然会在这里主导性能 - 即使你将它重定向到某种“空”接收器。

差异,IMO,是

Console.WriteLine(i);

阅读起来比较简单......所以我使用

在这种情况下,当它是一个整数时,两种形式都不会最终装箱i,因为WriteLine(int)有一个重载。 稍微更有趣的问题是在这两行之间:

Console.WriteLine("Some format {0} stuff", i);
Console.WriteLine("Some format {0} stuff", i.ToString());

第一个表格将整数;第二个不会。性能差异? Nothing significant.

答案 1 :(得分:2)

没有实际区别,两者都会调用ToString将数字转换为字符串。

答案 2 :(得分:1)

应该 没有区别。如果你自己没有明确地这样做,Console.WriteLine方法应该自动调用ToString()方法。但是,如果您查看IL代码,我会惊讶地发现它们不相同。显然,Console.Writeline(int)必须在内部将int转换为十进制字符串,但这在IL中并不明显......

对于此代码:

static void Main(string[] args)
{
    int i = 34;
    Console.WriteLine(i);
    Console.WriteLine(i.ToString());

}

IL

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: nop 
    L_0001: ldc.i4.s 0x22
    L_0003: stloc.0 
    L_0004: ldloc.0 
    L_0005: call void [mscorlib]System.Console::WriteLine(int32)
    L_000a: nop 
    L_000b: ldloca.s i
    L_000d: call instance string [mscorlib]System.Int32::ToString()
    L_0012: call void [mscorlib]System.Console::WriteLine(string)
    L_0017: nop 
    L_0018: ret 
}

使用Jon的示例(使用string.format),第一种情况(没有ToString())值 框... 代码:

    int i = 34;
    Console.WriteLine(string.Format("Some format {0} stuff", i));
    Console.WriteLine(string.Format("Some format {0} stuff", i.ToString()));

IL

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] int32 i)
    L_0000: nop 
    L_0001: ldc.i4.s 0x22
    L_0003: stloc.0 
    L_0004: ldstr "Some format {0} stuff"
    L_0009: ldloc.0 
    L_000a: box int32
    L_000f: call string [mscorlib]System.String::Format(string, object)
    L_0014: call void [mscorlib]System.Console::WriteLine(string)
    L_0019: nop 
    L_001a: ldstr "Some format {0} stuff"
    L_001f: ldloca.s i
    L_0021: call instance string [mscorlib]System.Int32::ToString()
    L_0026: call string [mscorlib]System.String::Format(string, object)
    L_002b: call void [mscorlib]System.Console::WriteLine(string)
    L_0030: nop 
    L_0031: ret 
}

答案 3 :(得分:0)

首先,优化到这个级别真的不会给你带来任何好处。优化您的算法,然后分析并优化您的瓶颈。我会专注于哪个更具可读性和可维护性(在这两种情况下我更喜欢第一个......)

然而,从性能的角度来看,第一个通常会更好。如果用int调用第一个,它会有效地调用第二个。使用字符串,您将获得额外的(无操作)方法调用。