2011-04-07 2 views
1

C#으로 라이브러리를 만들고 있는데 가능한 한 효율적으로 라이브러리를 만들고 싶다. 다음은 내가 개발 한 두 가지 스타일입니다. 하나가 다른 하나보다 빠르다면, 알고 싶습니다. 왜 그렇습니까? 또는 동일한 효과가있는 경우나는 C#의 메소드에서 제공된 스타일을 사용하는 것이 더 효과적 일 수 있다고 조언했다. (보다 효율적 임)

스타일 1

Object[] row; 
while (sqlDataReader.Read()) 
{ 
    row = new Object[sqlDataReader.FieldCount]; 
    for (int i = 0; i < row.Length; i++) 
     row[i] = sqlDataReader[i]; 
    databaseResults.Add(row); 
} 

스타일 2 :

while (sqlDataReader.Read()) 
{ 
    Object[] row; = new Object[sqlDataReader.FieldCount]; 
    for (int i = 0; i < row.Length; i++) 
     row[i] = sqlDataReader[i]; 
    databaseResults.Add(row); 
} 
+1

물론이 호출의 사용자는 모든 것을 다시 사용하여이를 사용해야합니다. – asawyer

답변

3

AFAIK, 그들은 동일한 성능을 제공합니다. 첫 번째 스타일은 while 루프 이후에 무엇을하는지에 따라 행에 대한 참조를 유지할 수 있으므로 나중에 행을 사용하지 않으려는 경우 스타일 2로 이동합니다.

0

이들은 모두 동일한 속도로 실행됩니다. 왜냐하면 Object[] row 선언은 중요한 (모든?) CPU 시간을 소비하지 않기 때문입니다. 특히 루프 내에서 또는 루프 밖에서 선언 할 때 더 이상 시간을 소비하지 않습니다. 선언 한 곳은 범위를 제어 할 뿐이지 만 가비지 수집기는 동일한 방식으로 작동합니다.

는 루프 (보통 *)의 내부 또는 외부 C 번호 스타일 2.

0

의 변수의 선언을 이동 청소기의 변수만을 내부 사용될 때 컴파일 된 코드에 어떤 변화도 없다 말한 루프. 옵티마이 저는 동일하게 동작하므로 동일하게 만듭니다.

* 예외는 변수가 익명 메소드로 캡처 된 경우입니다. 그런 일이 발생하면 선언 범위는 프로그램의 의미에 영향을 미칩니다. 루프 내에서 선언 된 캡처 된 변수의 새 인스턴스는 루프가 실행될 때마다 생성되고 외부에서 선언 된 인스턴스는 모든 반복을 통해 다시 사용됩니다.

표시된 코드에 익명 메소드가 없으므로이 예외는 적용되지 않습니다.

관련 문제