답변:
가능한 개선 소스 목록은 다음과 같습니다.
일반
캐싱
CompiledQuery.Compile()
쿼리 표현식의 재 컴파일을 피하면서 재귀 적으로 사용OutputCacheAttribute
불필요하고 행동적인 실행을 저장하기 위해 사용 하기 쉬운 변경하지 않는 컨텐츠 캐시ActionResult
필요한 경우 사용자 정의 방법 작성RouteName
하여 경로를 구성한 다음이를 사용하여 링크를 생성하고 표현식 트리 기반 ActionLink 메소드를 사용하지 마십시오.PartialViews
렌더링하지 마십시오 . 동일한 뷰에서 동일한 부분을 300 번 호출하면 문제가있을 수 있습니다. 설명 및 벤치 마크라우팅
사용 Url.RouteUrl("User", new { username = "joeuser" })
경로를 지정할 수 있습니다. ASP.NET MVC 성능 : Rudi Benkovic
이 도우미 ASP.NET MVC 성능을 사용한 캐시 경로 해결 UrlHelperCached
Rudi Benkovic
보안
DAL
부하 분산
리버스 프록시를 활용하여 앱 인스턴스에 클라이언트로드를 분산시킵니다. 스택 오버플로는 HAProxy ( MSDN )를 사용합니다.
사용 비동기 컨트롤러를 외부 자원 처리에 의존하는 작업을 구현합니다.
고객 입장에서
글로벌 구성
Razor를 사용하는 경우 기본적으로 global.asax.cs에 다음 코드를 추가하십시오. 기본적으로 Asp.Net MVC는 aspx 엔진 및 면도기 엔진으로 렌더링합니다. 이것은 RazorViewEngine 만 사용합니다.
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
web.config에 gzip (HTTP 압축) 및 정적 캐시 (이미지, CSS 등)를 추가하십시오
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
기본 제안은 REST 원칙 을 따르는 것이며 다음 요점은 이러한 원칙 중 일부를 ASP.NET MVC 프레임 워크에 연결합니다.
LINQ를 통해 데이터에 액세스 할 때 IQueryable에 의존합니다 ...
List () 대신 AsQueryable ()을 사용하는 이유는 무엇입니까?
... 좋은 리포지토리 패턴을 활용하십시오.
이렇게하면 필요한 데이터 만로드되고 필요한 경우에만 데이터 액세스가 최적화됩니다.
획기적인 최적화는 아니지만 jQuery 등에 CDN을 사용하십시오 .
ScottGu 자신의 인용문 : Microsoft Ajax CDN을 사용하면 ASP.NET AJAX 또는 jQuery를 사용하는 ASP.NET Web Forms 및 ASP.NET MVC 응용 프로그램의 성능을 크게 향상시킬 수 있습니다. 이 서비스는 무료로 제공되며 등록이 필요하지 않으며 상업 및 비상업적 목적으로 모두 사용할 수 있습니다.
jQuery를 사용하는 Moss의 웹 파트에 CDN도 사용합니다.
또한 NHibernate 를 사용하는 경우 조회를 위해 2 차 레벨 캐시를 켜고 설정하고 조회 범위 및 시간 종료에 추가 할 수 있습니다. 그리고 EF , L2S 및 NHibernate ( http://hibernatingrhinos.com/products/UberProf)에 대한 킥 엉덩이 프로파일 러가 있습니다. 쿼리를 조정하는 데 도움이됩니다.
나는 또한 추가 할 것이다 :
스프라이트 사용 : 스프라이트는 요청을 줄이는 좋은 방법입니다. 모든 이미지를 하나의 이미지로 병합하고 CSS를 사용하여 스프라이트의 좋은 부분을 얻습니다. Microsoft는 좋은 라이브러리를 제공합니다 : Sprite 및 Image Optimization Preview 4 .
서버 개체 캐시 : 거의 변경되지 않는 참조 목록이나 데이터가있는 경우 매번 데이터베이스를 쿼리하지 않고 메모리에 캐시 할 수 있습니다.
Entity Framework 대신 ADO.NET을 사용하십시오 . EF4 or EF5
개발 시간을 줄이는 데는 좋지만 최적화하는 데 어려움이 있습니다. Entity Framework보다 저장 프로 시저 를 최적화하는 것이 더 간단합니다 . 따라서 저장 프로 시저를 가능한 많이 사용해야합니다. Dapper는 매우 우수한 성능으로 SQL을 쿼리하고 매핑하는 간단한 방법을 제공합니다.
캐시 페이지 또는 부분 페이지 : MVC는 일부 매개 변수에 따라 페이지를 캐시하는 쉬운 필터를 제공하므로 사용하십시오.
데이터베이스 호출 감소 : 여러 개체를 반환하는 고유 한 데이터베이스 요청을 만들 수 있습니다. Dapper 웹 사이트를 확인하십시오.
항상 깨끗한 아키텍처 유지 : 소규모 프로젝트에서도 깨끗한 n 계층 아키텍처를 갖습니다 . 코드를 깨끗하게 유지하는 데 도움이되며 필요한 경우 최적화하는 것이 더 쉬울 것입니다.
이 템플릿 " Neos-SDI MVC 템플릿 "을 보면 기본적으로 성능이 많이 향상되어 깔끔한 아키텍처를 만들 수 있습니다 ( MvcTemplate 웹 사이트 확인 ).
서버 측에서 응용 프로그램을 최적화하는 데 대한 모든 훌륭한 정보 외에도 YSlow를 살펴보아야한다고 말하고 싶습니다 . 클라이언트 측에서 사이트 성능을 향상시키는 데 유용한 리소스입니다.
이는 ASP.NET MVC뿐만 아니라 모든 사이트에 적용됩니다.
가장 쉬운 방법 중 하나는 페이지에 원하는 데이터에 액세스 할 때 비동기 적으로 생각하는 것입니다. 웹 서비스, 파일, 데이터베이스 등에서 읽을 때 가능한 한 비동기 모델을 사용하십시오. 한 페이지가 더 빠를 수는 없지만 서버의 전반적인 성능을 향상시키는 데 도움이됩니다.
1 : 타이밍을 얻으십시오. 둔화의 위치를 알기 전까지는 질문에 대한 답변이 너무 광범위합니다. 내가 작업하고있는 프로젝트에는이 정확한 문제가 있습니다. 어떤 일이 얼마나 오래 걸리는지를 알기위한 기록은 없습니다. 프로젝트에 타이밍을 추가 할 때까지 앱의 느린 부분에 대해서만 추측 할 수 있습니다.
2 : 순차적 작업이있는 경우 가볍게 멀티 스레드를 두려워하지 마십시오. 특히 차단 작업이 관련된 경우. PLINQ는 당신의 친구입니다.
3 : 게시 할 때 MVC 뷰를 미리 생성합니다. '첫 페이지 조회수'에 도움이됩니다.
4 : 일부는 저장 프로 시저 / ADO 속도의 장점을 주장합니다. 다른 사람들은 EF의 개발 속도와 계층의 명확한 분리 및 목적에 대해 주장합니다. SQL 및 해결 방법이 데이터 검색 및 저장을 위해 Sprocs / Views를 사용하는 경우 실제로 디자인이 느립니다. 또한 테스트하기가 어렵습니다. 현재 ADO에서 EF로 변환하는 현재 코드베이스는 이전 수동 롤링 모델보다 성능이 떨어지거나 성능이 저하되는 경우가 있습니다.
5 : 애플리케이션 워밍업에 대해 생각해보십시오. 대부분의 EF 성능 문제를 해결하기 위해 수행하는 작업 중 하나는 특수 예열 방법을 추가하는 것이 었습니다. 쿼리 또는 아무것도 미리 컴파일하지 않지만 많은 메타 데이터로드 / 생성에 도움이됩니다. 이것은 Code First 모델을 다룰 때 더욱 중요 할 수 있습니다.
6 : 다른 사람들이 말했듯이 가능하면 세션 상태 또는 ViewState를 사용하지 마십시오. 반드시 개발자가 생각하는 성능 최적화는 아니지만보다 복잡한 웹 응용 프로그램을 작성하기 시작하면 응답 성이 필요합니다. 세션 상태가이를 배제합니다. 오래 실행되는 쿼리를 상상해보십시오. 새 창을 열고 덜 복잡한 창을 사용하기로 결정했습니다. 서버가 세션의 다음 요청으로 이동하기 전에 첫 번째 요청이 완료 될 때까지 서버가 대기하기 때문에 세션 상태가 켜진 상태로 대기했을 수도 있습니다.
7 : 데이터베이스로의 왕복을 최소화하십시오. 자주 사용하지만 실제로는 .Net Cache로 변경되지 않는 항목을 저장하십시오. 가능하면 삽입물 / 업데이트를 일괄 처리하십시오.
7.1 : 좋은 이유없이 Razor보기에서 데이터 액세스 코드를 피하십시오. 나는 그것을 보지 않았다면 이것을 말하지 않을 것입니다. 그들은 모델을 만들 때 이미 데이터에 액세스하고 있었는데 왜 모델에 모델을 포함시키지 않았습니까?
Microsoft Azure (IaaS 또는 PaaS)에서 ASP.NET MVC 응용 프로그램을 실행중인 경우 적어도 첫 번째 배포 전에 다음을 수행하십시오.