我有两种情况:
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 init
、STLoc.0
和ldloc.0
。
这是否意味着第一种情况的性能会比第二种情况更弱,第二种情况是将字符串直接传递给方法而不是先将其存储在局部变量中?
我看到了问题Does initialization of local variable with null impacts performance?但它似乎与我在这里需要知道的有点不同。谢谢。
最佳答案
一方面,您正在查看未优化的 IL - 因此所有的“nop”。您可能发现它在构建发布版本时生成不同的代码。
即使使用未优化的版本,如果您在优化的 JIT 下运行,我希望它以相同的 JIT 代码结束。
即使使用非优化的 JIT,它确实每次调用时实际生成的代码都会做更多的工作,但看到这对任何实际应用程序产生重大影响,我都会感到震惊。
一如既往:
- 在开始之前设定绩效目标,并根据这些目标衡量。
- 找出哪些决策在以后的性能方面将难以解决,并且比像这样的决策更担心这些决策,这些决策可以在以后更改而不会影响其他地方。
- 编写最简单、最易读且最先起作用的代码。
- 如果表现不够好,请调查是否做出会损害可读性的更改有助于提高性能以保证痛苦。
关于c# - 本地字符串变量的实例化会影响性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579714/