У меня две ситуации:
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
. Означает ли это, что первый случай будет работать слабее, чем второй случай, когда строка напрямую передается методу, а не сначала сохраняется в локальной переменной?
Я видел вопрос Влияет ли инициализация локальной переменной с нулевым значением на производительность? но, кажется, это немного отличается от того, что мне нужно знать здесь. Спасибо.