本地字符串变量的实例化会影响性能吗?

ash*_*tee 3 c# string performance il initialization

我有两种情况:

    static void CreateCopyOfString()
    {
        string s = "Hello";
        ProcessString(s);
    }
Run Code Online (Sandbox Code Playgroud)

    static void DoNotCreateCopyOfString()
    {
        ProcessString("Hello");
    }
Run Code Online (Sandbox Code Playgroud)

这两种情况的IL看起来像这样:

    .method private hidebysig static void  CreateCopyOfString() cil managed
    {
        // Code size       15 (0xf)
        .maxstack  1
        .locals init ([0] string s)
        IL_0000:  nop
        IL_0001:  ldstr      "Hello"
        IL_0006:  stloc.0
        IL_0007:  ldloc.0
        IL_0008:  call       void ConsoleApplication1.Program::ProcessString(string)
        IL_000d:  nop
        IL_000e:  ret
    } // end of method Program::CreateCopyOfString
Run Code Online (Sandbox Code Playgroud)

    .method private hidebysig static void  DoNotCreateCopyOfString() cil managed
    {
          // Code size       13 (0xd)
          .maxstack  8
          IL_0000:  nop
          IL_0001:  ldstr      "Hello"
          IL_0006:  call       void ConsoleApplication1.Program::ProcessString(string)
          IL_000b:  nop
          IL_000c:  ret
    } // end of method Program::DoNotCreateCopyOfString
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,有额外的呼叫string init,stloc.0ldloc.0.这是否意味着第一种情况比第二种情况更弱,其中字符串直接传递给方法而不是首先将其存储在局部变量中?

我看到了一个问题,使用null初始化局部变量会影响性能吗?但它似乎与我在这里需要知道的有点不同.谢谢.

Jon*_*eet 11

你看一下未经优化的IL,一方面 - 因此所有的"nop".在构建Release版本时,您可能会发现它生成了不同的代码.

即使使用未经优化的版本,如果您在优化的JIT下运行,我希望它最终得到相同的JITted代码.

即使非优化JIT它没有实际产生的代码,并更多每个这叫准时上班,我会错开,看到这个在任何真正的应用程序中的显著影响.

如初:

  • 在开始之前设置性能目标,并针对它们进行衡量.
  • 确定哪些决策在以后的性能方面难以解决,并且担心这些决定远远超过这样的决定,这些决定可以在以后更改,而不会影响其他地方.
  • 编写最先简单,最易读的代码.
  • 如果效果不佳,请调查是否进行了有害可读性的更改有助于提高性能以保证疼痛.