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

标签 c# string performance initialization il

我有两种情况:

    static void CreateCopyOfString()
    {
        string s = "Hello";
        ProcessString(s);
    }

    static void DoNotCreateCopyOfString()
    {
        ProcessString("Hello");
    }

这两种情况的 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

    .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

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

我看到了问题Does initialization of local variable with null impacts performance?但它似乎与我在这里需要知道的有点不同。谢谢。

最佳答案

一方面,您正在查看未优化的 IL - 因此所有的“nop”。您可能发现它在构建发布版本时生成不同的代码。

即使使用未优化的版本,如果您在优化的 JIT 下运行,我希望它以相同的 JIT 代码结束。

即使使用非优化的 JIT,它确实每次调用时实际生成的代码都会做更多的工作,但看到这对任何实际应用程序产生重大影响,我都会感到震惊。

一如既往:

  • 在开始之前设定绩效目标,并根据这些目标衡量
  • 找出哪些决策在以后的性能方面将难以解决,并且比像这样的决策更担心这些决策,这些决策可以在以后更改而不会影响其他地方。
  • 编写最简单、最易读且最先起作用的代码。
  • 如果表现不够好,请调查是否做出会损害可读性的更改有助于提高性能以保证痛苦。

关于c# - 本地字符串变量的实例化会影响性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579714/

相关文章:

c# - 无法将 IList 转换为绑定(bind)列表

c# - 将更多表列添加到列表框显示查询

c# - 带有字符串参数的构造函数的通用约束?

python - 切断空白

java - 使用 for 循环迭代 HashSet

java - 使用公共(public)静态字段,良好的编程习惯/快速?

c# - 如何在使用数据库的 WCF 服务中处理并发

performance - HTTP 缓存、浏览器差异

database - (HTML 5) 太多的本地存储是多少?

javascript - 获取括号内的文本