2009-10-09 3 views
1

내보기에서 foreach을 사용하여 강력한 형식의 모델을 반복하고 표를 표시합니다. 25 행 7 열만 있으면 약 280 밀리 초가 걸립니다. 이것은 느린 것 같습니다. 뷰에서 루프를 사용하기 위해 알아야 할 성능 트릭이 있습니까?ASP.NET MVC View에서 foreach 루프가 왜 느린가요?

편집 : 내 컨트롤러는 Azure 테이블에서 데이터를 가져 와서 ViewModel 패턴을 사용하여보기로 가져옵니다. 이 문제에 관해서는 모르겠지만 내 Views는 VB이고 내 모델은 C#입니다. 그래서, 그들은 별도의 프로젝트에 있습니다. 게시 할 수있는 슬림화 된 예를 생각해 내겠다. 그러나 나는 지금 문을 다 써 버렸고, 오늘 저녁 늦게 이것을해야 할 것이다. 사람들이 주말에 집에 가기 전에 StackOverflow 군중을 잡기를 바랬습니다. 그래서 원래의 게시물은 예제 코드없이 빠르게 만들어졌습니다.

편집 : 나는 게으름 짐이 일어나지 않았 음을 피들러에게 확인했습니다. 보기를 렌더링하는 동안 피들러 활동이 없습니다.

EDIT : Azure 테이블의 데이터로 뷰를 공급하는 경우 280 msec가 소요됩니다. Azure 테이블에서 실제 데이터처럼 보이는 위조 된 데이터로 동일한 뷰를 피드하면 60msec가 걸립니다. 두 경우 모두 컨트롤러는 ViewModel 객체를 채우고 뷰로 전달합니다. 두 인스턴스에서 동일한 ViewModel 클래스가 사용됩니다. 나는 그것을 얻지 않는다.

편집 : 생각났습니다. 아마도 처음에 코드를 포함 시켰 더라면 다른 모든 사람들에게는 이것이 분명했을 것입니다. 여기 내 뷰 모델입니다 : 내보기에 위의 ViewModel을 통과하면

public class EmployeeChildrenViewModel 
{ 
    public Employee employee; 
    public IEnumerable<Child> children; 
} 

foreach 280 밀리 초 걸립니다. 위의 ViewModel을 children.ToList()으로 채우면보기에는 60msec 밖에 걸리지 않습니다. 그러나 추가 조사를 통해 전체 페이지로드 시간이 두 경우 모두 동일하다는 것을 알 수 있습니다. IEnumerable이 내 컨트롤러 또는 내 View에서 반복되는 경우 전체적인 효과가 동일하므로 중요하지 않습니다. 필자는 Fiddler에서 확인한 바와 같이 그 시점에서 데이터베이스를 때리는 것이 아니라는 것을 알고 있기 때문에 여전히 children을 반복하는 것이 확실하지 않습니다.

+1

반복 할 내용을 알려주십시오. 무언가가 무거울 수도 있고 실제로 실현되지 않을 수도 있습니다. 문제에 대한 정보를 제공하지 않았습니다. – Karl

+0

몇 가지 코드를 보여 주시겠습니까? –

+0

@ eu-ge-ne & @Karl : 죄송합니다. 처음에 그렇게 했어야했습니다. 코드가 게시되었습니다. – royco

답변

4

Linq-to-SQL 또는 기본적으로 지연로드되는 다른 ORM을 사용하고 있습니까?

모든 데이터베이스 호출 (datacontext.Log = TextWriter에서 상속하는 클래스)을 로깅하고보기에서 연결을 지연시킬 때 지연 연결이로드되는지 확인하는 것이 좋습니다.

편집 : 아래 정보는이 질문에 관련이없는 것처럼 보이지만이 사람에게 유용 할 수 있습니다 나는 여기 떠날거야 :

곧 당신이 Linq에 - 투 - SQL을 사용하는 가정 여기서는 그렇지 않다면 편집하겠습니다.

foo 모델에는 foo.Bar와 같은 연관 바가 있으며 datacontext에 LoadOptions를 지정하지 않으면 Bar가 지연되어로드됩니다. (그래서 : 호출 될 때로드, 아마도 당신의보기에서 일어나는 것처럼) 그것은 뷰가 근본적으로 데이터베이스로 간다는 것을 의미합니다. 그리고 이것은 모든 행에 대해 발생합니다.

다음과 같이 수행

using(DataContext context = new DataContext()) 
{ 
} 

이제 예외를 생성합니다보기는 어떤 연관이있다 : 또한

DataLoadOptions options = new DataLoadOptions(); 
options.LoadWith<Foo>(f => f.Bar); 
context.LoadOptions = options; 

는이를 방지하기 위해, using 문에 당신의 DataContext를 포장하려고 DataContext가 지금까지 삭제되고 데이터베이스 작업에 사용할 수 없으므로 느리게로드됩니다.

+0

답변 해 주셔서 감사합니다 .LINQ-to-SQL을 사용하고 있지는 않지만 게으른로드가 내보기에서 발생하면 내 게시물은 부분적인 설명으로 이어지는 몇 가지 다른 것들을 시도하도록 영감을주었습니다. – royco

0

는 .NET 4.0 베타 VS 2010 베타를 얻고,

Parallel.Foreach

편집()

를 사용 : 위의 대답은 약간 비꼬는 있어야했다. 진정한 솔루션은 아니지만, VS 2010에서 TPL의 이점을 얻은 후에는 내 뜻을 알 수 있습니다.

실제로 루프에서 무엇을하고 정확히 루프에서 무엇을하고 있으며 실제로 코드 구조, 데이터 구조 등에 달려 있습니다. 위의 것보다 덜 비꼬는 대답에 대한 자세한 정보가 필요합니다.

+2

"dog slow"의 두 배나 빠른 속도입니다. 문제에 대한 해결책은 아니지만 증상에 대한 해결책입니다. – JulianR

+1

해결책이 있다면 병렬 컴퓨팅으로 옮겨가는 것을 모른다. –

+0

@JulianR - "dog slow"보다 1000 배 빠른 속도로 일반적인 문제의 복잡성을 개선하지는 않지만, 나는 어느 날 1000x 빠른 버전을 사용하는 것을 선호합니다. – Sev

0

보기에서만 실제로 발생합니까? 어쩌면 반복하는 동안 전체 프로세스가 느려지는 데이터베이스로드를 수행합니다. 어떤 종류의 게으른 로딩이 구현되어 있습니까? 해당 프로세스 중 데이터베이스 활동을 점검해야합니다.

+0

예, 성능 문제는보기의 루프 하나에 있습니다. 필자는 내보기에 어떤 것이 있는지 확인하기 위해 피들러를 사용했습니다. 데이터베이스 활동, 그리고하지 않습니다. 귀하의 게시물을 주셔서 감사합니다. – royco

+0

@ Slack : 피들 러가 db 활동을 확인하는 데 도움이되는 방법은 무엇입니까? – UpTheCreek

관련 문제