첫 번째로 이것에 대해 걱정하는 것은 미세 최적화입니다. 애플리케이션의 성능을 연구 할 때까지는 걱정할 필요가 없으며 프로파일 링을 통해이 메소드와 루프가 병목 현상이 있음을 알 수 있습니다. 두 번째로 컴파일러는 로컬 변수 re
과 ddl
의 동일한 인스턴스를 다시 사용합니다. 일리노이 여기
class Program {
static void Main(string[] args) {
string[] strings = new [] { "hello", "world" };
foreach (string s in strings) {
int i = s.Length;
}
return;
}
}
있어 :
.method private hidebysig static void Main(string[] args) cil managed {
.entrypoint
.maxstack 3
.locals init (
[0] string[] strings,
[1] string s,
---> [2] int32 i,
[3] string[] CS$0$0000,
[4] string[] CS$6$0001,
[5] int32 CS$7$0002,
[6] bool CS$4$0003)
L_0000: nop
L_0001: ldc.i4.2
L_0002: newarr string
L_0007: stloc.3
L_0008: ldloc.3
L_0009: ldc.i4.0
L_000a: ldstr "hello"
L_000f: stelem.ref
L_0010: ldloc.3
L_0011: ldc.i4.1
L_0012: ldstr "world"
L_0017: stelem.ref
L_0018: ldloc.3
L_0019: stloc.0
L_001a: nop
L_001b: ldloc.0
L_001c: stloc.s CS$6$0001
L_001e: ldc.i4.0
L_001f: stloc.s CS$7$0002
L_0021: br.s L_0038
L_0023: ldloc.s CS$6$0001
L_0025: ldloc.s CS$7$0002
L_0027: ldelem.ref
L_0028: stloc.1
L_0029: nop
L_002a: ldloc.1
--->L_002b: callvirt instance int32 [mscorlib]System.String::get_Length()
--->L_0030: stloc.2
L_0031: nop
L_0032: ldloc.s CS$7$0002
L_0034: ldc.i4.1
L_0035: add
L_0036: stloc.s CS$7$0002
L_0038: ldloc.s CS$7$0002
L_003a: ldloc.s CS$6$0001
L_003c: ldlen
L_003d: conv.i4
L_003e: clt
L_0040: stloc.s CS$4$0003
L_0042: ldloc.s CS$4$0003
L_0044: brtrue.s L_0023
L_0046: br.s L_0048
L_0048: ret
}
공지 주민 부에서 변수 i
번째 위치를 차지 선언되었는지
여기 매우 간단한 예제 스택에서 이것은 루프를 통해 각 반복에 get_Length
의 결과가 반복적으로 저장되는 곳입니다. (나는 여백에 --->
s와 관련된 라인을 강조 표시했다.)
감사합니다, 제이슨. 이것은 내가 찾고 있었던 바로 그 것이다! 내가 함께 일하는 개발자는 루프 내에서 선언 된 변수를 갖는 것이 비효율적이라고 말했다. 그러나 나는 현명한 컴파일러가 무엇인지 상상하기가 어려웠다. 컴파일러가 각 반복마다 새로운 메모리를 다시 할당 할 것이라고 상상하기가 어려웠다. 컴파일러는 당신이 보여준 것처럼 정확히 할 수있는 것처럼 보였지만 읽거나 얻는 방법을 모르기 때문에 이것을 증명할 수 없었습니다. 다시 한 번 감사드립니다! – Jagd