У меня есть две ситуации:Создает ли экземпляр локальной производительности с переменной скоростью?
static void CreateCopyOfString()
{
string s = "Hello";
ProcessString(s);
}
и
static void DoNotCreateCopyOfString()
{
ProcessString("Hello");
}
The 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 выглядели бы точно так же. – MarcinJuraszek
Он был скомпилирован в отладке. Позвольте мне проверить с режимом выпуска. – ashtee
Тот же результат с выпуском сборки. – ashtee