2009-12-08 8 views
0

다음과 같은 클릭 이벤트가 있습니다. .NET의 성능 및 foreach 루프

protected void btnUpdate_Click(object sender, EventArgs e) { 
     foreach (GridViewRow gvr in gvEditBulletins.Rows) { 
      RadEditor re = (RadEditor)gvr.FindControl("reBulletin"); 
      DropDownList ddl = (DropDownList)gvr.FindControl("ddlPosition"); 

      // Business logic 
     } 
    } 

내가 매일 반복으로 RadEditor하고있는 DropDownList의 인스턴스를 선언하고있어 이후 성능 저하를 고통 수행하거나, 컴파일러는 인스턴스를 재사용 알고 똑똑?

답변

2

첫 번째로 이것에 대해 걱정하는 것은 미세 최적화입니다. 애플리케이션의 성능을 연구 할 때까지는 걱정할 필요가 없으며 프로파일 링을 통해이 메소드와 루프가 병목 현상이 있음을 알 수 있습니다. 두 번째로 컴파일러는 로컬 변수 reddl의 동일한 인스턴스를 다시 사용합니다. 일리노이 여기

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와 관련된 라인을 강조 표시했다.)

+0

감사합니다, 제이슨. 이것은 내가 찾고 있었던 바로 그 것이다! 내가 함께 일하는 개발자는 루프 내에서 선언 된 변수를 갖는 것이 비효율적이라고 말했다. 그러나 나는 현명한 컴파일러가 무엇인지 상상하기가 어려웠다. 컴파일러가 각 반복마다 새로운 메모리를 다시 할당 할 것이라고 상상하기가 어려웠다. 컴파일러는 당신이 보여준 것처럼 정확히 할 수있는 것처럼 보였지만 읽거나 얻는 방법을 모르기 때문에 이것을 증명할 수 없었습니다. 다시 한 번 감사드립니다! – Jagd

0

페이지에 해당 컨트롤이 있어야하므로 성능에 영향을주지 않아야합니다. 그렇지 않으면 어떻게 찾을 수 있습니까?

3

새 인스턴스 (을 만드는 컨트롤에 사용자 지정 명시 적 캐스트 연산자가 없으면 )가 생성되지 않습니다. Find는 Exiting 개체를 찾아내어 캐스팅합니다.

+1

이것은 그가 요구하는 것이 아닙니다. – jason

+1

어쩌면 그가 의미하는 바가 아니지만 그가 묻는 것일 수 있습니다. –

+0

아니요, 그렇지 않습니다. 그는 루프 내부에있는 선언과 모든 반복에서 히트 여부에 대해 물었습니다. 이것은 매우 분명합니다. – jason

0

성능 히트? 초당 1000 번 버튼을 클릭 할 수 있습니까? 그렇다면 일 수도 있고 일 수 있습니다.