Dapper / EF - 변수가 사용 범위 밖에있을 때 성능이 향상되는 이유는 무엇입니까?

c# dapper entity-framework scope using

문제

아래 두 쿼리를 동일한 params와 stored proc를 사용하여 실행했습니다. 예제 A는 1 분 이상 소요되며 예제 B는 20 초 미만입니다. EF를 사용하여이 동일한 proc을 호출하면 약 10 초 (약 50000 개가 넘는 레코드가 반환 됨)까지 내려갑니다. 그래서 EF가 더 빠른 이유에 대해서도 의문의 여지가 있습니다.

예 A :

            List<resultObj> result;

            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["string"].ConnectionString))
            {
                    result = conn.Query<resultObj>("spProc", param: new { /*params here*/ }, 
                    commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();
            }

예 B :

            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["string"].ConnectionString))
            {
                var result = conn.Query<resultObj>("spProc", param: new { /*params here*/ }, 
                    commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();
            }

결과 변수를 사용 범위 밖으로 이동하면 성능이 크게 향상되는 이유는 무엇입니까?

수락 된 답변

그 이유가 될 이유가 없습니다. 이 경우 데이터베이스 서버의 병목 현상으로 인해 어떤 차이가 있는지 의심 스럽습니다. 아마도 데이터를 처음으로 메모리에 채우는 것입니다 (느린 디스크, 디스크 충돌이있는 곳) 또는 서버 경합 또는 네트워크 처리량 문제 일 수 있습니다. 두 예제에서 설명하는 것은 변수가 선언 된 위치의 차이가 아닌 기본 데이터 소스에 의해서만 발생할 수 있습니다.

사소한 메모로 : AsList()ToList() 좋지만, 이것도 역시 작은 시간 (아마도 밀리 초 미만)을 절약 해줍니다.

프로파일 링을 할 때 다음을 수행해야합니다.

  • IDE없이 연결 해제 모드로 작업
  • JIT를 수행하고 모든 외부 소스를 먼저 프라임합니다. 일반적으로 타이밍을 시작 하기 전에 적어도 한 번 이상 실행합니다.
  • 모든 것을 여러 번 측정하십시오 (빠른 작업의 경우 평균을 얻기 위해 수천 번 수행하는 것이 일반적입니다 - 반복 당 30 초가 걸린다면 그렇게 적용 할 수 없습니다)
  • 강제적으로 GC 등을 수행하여 추가 GC가 테스트 대상의 오류 일 수 있도록합니다.
  • 테스트 머신 / 서버 / 네트워크에서 경쟁 우위를 피하십시오.

인기 답변

게시 한 두 개의 코드는 컴파일 할 때 사실상 동일한 IL 코드를 생성합니다. 유일한 차이점은 레지스터가 어떤 변수를 나타내는 데 사용되며 프로그램 실행 방법에 영향을주지 않을 것입니다.

보고있는 결과는이 코드 외부의 요인으로 인해 발생합니다. 성능에 영향을 줄 수있는 많은 요소가 있으며, 귀하의 경우에 문제의 원인을 확실히 밝힐 수는 없습니다. 아마도 데이터베이스는 처음 코드를 실행 한 이후로 인덱스 계획을 다시 생각했습니다. 아마도 데이터베이스 연결에 예기치 않은 영향을주는 다른 코드를 변경했을 것입니다. 어쩌면 원격 시스템이 잠시 더 무거웠을 수도 있습니다. 그러나 차이점은 여기서 제공 한 코드 변경이 아니라는 것입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow