代码之家  ›  专栏  ›  技术社区  ›  pavanred

其中哪一个在性能上更好?

  •  3
  • pavanred  · 技术社区  · 15 年前

    这两种说法有什么区别?哪一个性能更好?

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

    其中i是字符串或整数。

    4 回复  |  直到 15 年前
        1
  •  14
  •   Jon Skeet    15 年前

    归根结底,写入控制台必然会在这里控制性能——即使您将其重定向到某种“空”接收器。

    不同的是,我认为

    Console.WriteLine(i);
    

    更容易阅读…所以我会用这个直到 经过证实的 使用可读性稍差的形式有一个具体的好处。在这种情况下,两种形式都不会以拳击结束 i 当它是一个整数时,因为 WriteLine(int) . 一 轻微地 更有趣的问题是这两行之间:

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

    第一个表单将对整数进行装箱;第二个表单将不装箱。性能差异? Nothing significant.

        2
  •  2
  •   Guffa    15 年前

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

        3
  •  1
  •   Charles Bretana    15 年前

    在那里 应该 没有区别。如果您自己没有显式地调用toString()方法,那么console.writeline方法应该可以自动调用。但是,如果您看看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 
    }
    
        4
  •  0
  •   Reed Copsey    15 年前

    首先,优化到这个水平真的不会给你带来任何好处。优化算法,然后分析并优化瓶颈。我将重点放在哪个更易于阅读和维护(在这两种情况下,我更喜欢第一个…)

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