2012-02-21 6 views
2

저는 약 5 년 동안 SubSonic 2를 사용해 왔으며 사랑했습니다. 그러나 지난 6 개월 동안 나는 SubSonic 3 또는 유사한 ORM 도구로 옮기는 아이디어를 가지고 놀았습니다. 우리 회사는 Telerik의 툴을 많이 사용했기 때문에 OpenAccess를 사용해 보았습니다. 구성을 마친 후에는 사용자 테이블 (~ 30 개 레코드)의 정보로 RadGrid를로드하는 극히 기본적인 작업을 시도 할 것이라고 생각했습니다.Telerik OpenAccess 대 SubSonic의 간단한 속도 테스트 ("더 좋지 않음"이 아닙니다)

그래서, 그리드의 OnNeedDataSource 이벤트에서 나는 다음과 같습니다

var start = System.Environment.TickCount; 
context = new EntitiesModel(); 
rgUsers.DataSource = (from u in context.Users select u); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

그 구축하고 페이지를 실행 한 후, 그것은 1607 밀리 걸린 다시 뱉어. 그러나 페이지를 새로 고친 후 다시 0 초가됩니다. (왜?)

난 후 음속 코드에 넣어 :

var start = System.Environment.TickCount; 
rgUsers.DataSource = new UserCollection().Load(); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

나는 처음으로 코드를 실행하고는 171 밀리했다 말한다. 페이지를 새로 고친 후 60-70ms가 걸렸다 고보고합니다.

는 그래서, 내 질문은 : 왜 OA 상당히 오래 걸릴 않는 첫 번째 방문에로드 할 수 있지만, 0 초로 각 페이지 새로 고침에로드? SubSonic은 최초 방문시 상당히 빠르지 만 각 페이지를 새로 고침 할 때 ~ 65ms가 걸립니다.

"기본"질문이거나 성능을 적절하게 테스트하지 않는 경우 사과드립니다. 이 방법을 향상시킬 수있는 방법이 있다면, 나는 조언을 크게 주시면 감사하겠습니다.

덕분에, 앤드류

답변

4

OpenAccess를 당신이 OpenAcccessContext을 만들 처음 생성되는 내부 데이터베이스 개체가 있습니다. 기본적으로 모든 기본값을 계산하고 캐시를 만들고 다른 인프라 개체를 초기화하는 등의 작업을합니다. 생성되는 즉시 내부 정적 사전에 저장됩니다 (connectionID는 키).

다른 모든 컨텍스트가 생성되면 해당 내부 개체가 사용되며 오버 헤드가 전혀 발생하지 않습니다. 1600ms가 조금 높다고 말하면 매핑 유형을 변경하는 것이 좋습니다 (xml은 최적의 성능을 발휘합니다).

최적화는 모델이 응용 프로그램 시작 핸들러에서 초기화되었는지 확인하는 것입니다. 다음 코드는이 트릭을 수행해야합니다.

void Application_Start(object sender, EventArgs e) 
{ 
    var modelInfo = new EntitiesModel().Metadata; 
} 

편집 : 후속 조치로서 0ms라고 말하면 실제로 쿼리 실행 시간이 아닙니다. 쿼리가 반환하는 것은 나중에 실행되는 IQueryable입니다. 실제 데이터를 얻으려면 ToList()를 호출해야합니다.

+0

감사합니다. 그건 의미가 있습니다. 나는 당신이 제안한대로했고 첫 번째 하중은 900ms로 내려 갔다. – ajtatum

1

는 이유는 OpenAccess를에서 데이터베이스를 여는 음속보다 더 긴 시간이 소요 될 수 있습니다. 로딩 시간을 측정하기 전에 데이터베이스를 열어보기와 같은 사소한 작업을 수행하십시오. SubSonic에서도 마찬가지입니다.

context = new EntitiesModel(); 
context.Users.Count(); 
var start = System.Environment.TickCount; 
rgUsers.DataSource = (from u in context.Users select u); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

토마스

0

이 주제는 아니지만 지난 몇 년 동안 SS2 및 SS3에 사용하고 기여 해왔다. 방금 ​​점검을 완료하고 MsAccessProvider를 SS2에 추가했으며 Enum 생성기를 SS2 및 SS3에 추가했습니다 (이들은 프로젝트 페이지에서 커밋되고 실행됩니다).

또한 SS3에 대한 고유 한 캐싱 프레임 워크를 함께 사용하여 고유 인덱스가 참조하는 데이터베이스의 테이블에서 데이터를 (일반 사전으로) 자동 선택 캐싱 할 수 있습니다. 웹 페이지의 템플릿 기반 생성을 위해 조회 데이터를 캐싱하고 SS3 LINQ 조회로 약 2 분에서 1 초 미만의 응답을 향상시킬 수있었습니다. (공개적으로 공개하지 않았습니다.)

SS 사용자의 관심을 끌기 위해이 자료를 게시 할 위치를 모르겠습니다. 미해결 사안의 근원과 폐지에 대한 저의 커멘트는 정확하게 제로 응답을 만들어 냈습니다.

+0

나는 더 많은 것을 배우고 싶다. github의 사용자 이름은 무엇입니까? 또는 어떻게 연락 할 수 있습니까? – ajtatum

+0

전 6 팩이에요. GitHub SubSonic 소스에 대한 커밋과 주석을 볼 수 있습니다. (미안 지연 - 일주일 간의 공휴일) –

+0

블로그 기사 : http://low-bandwidth.blogspot.com.au/2012/10/automated-foreign-key-list-generation.html –