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.0和ldloc.0.这是否意味着第一种情况比第二种情况更弱,其中字符串直接传递给方法而不是首先将其存储在局部变量中?
我看到了一个问题,使用null初始化局部变量会影响性能吗?但它似乎与我在这里需要知道的有点不同.谢谢.
Jon*_*eet 11
你看一下未经优化的IL,一方面 - 因此所有的"nop".在构建Release版本时,您可能会发现它生成了不同的代码.
即使使用未经优化的版本,如果您在优化的JIT下运行,我希望它最终得到相同的JITted代码.
即使非优化JIT它没有实际产生的代码,并更多每个这叫准时上班,我会错开,看到这个在任何真正的应用程序中的显著影响.
如初:
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |