Yanıtlar:
Olası iyileştirme kaynaklarının derlenmiş bir listesi aşağıdadır:
Genel
Önbelleğe almak
CompiledQuery.Compile()
Sorgu ifadelerinizin yeniden derlenmesinden kaçınarak tekrar tekrar kullanınOutputCacheAttribute
Gereksiz ve eylem yürütmelerini kaydetmek için değiştirilmeye eğilimli olmayan içeriği önbellekleActionResult
gerekirse yöntemleriRouteName
Rotanızı düzenlemek ve ardından bağlantılar oluşturmak için kullanabilir ve ifade ağacı tabanlı ActionLink yöntemi kullanmak değil denemek için.PartialViews
, xxxx kez işlemekten kaçının : Aynı görünümde aynı kısmi 300 kez çağırırsanız, muhtemelen bununla ilgili bir sorun vardır. Açıklama ve DeneylerYönlendirme
Url.RouteUrl("User", new { username = "joeuser" })
Rotaları belirtmek için kullanın . ASP.NET MVC Performansı Rudi Benkovic
Rudi Benkovic tarafından hazırlanan bu yardımcı ASP.NET MVC Perfomance kullanılarak önbellek yolu çözümlemesiUrlHelperCached
Güvenlik
DAL
Yük dengeleme
İstemci yükünü uygulama örneğinize yaymak için ters proxy'leri kullanın. (Yığın Taşması HAProxy ( MSDN ) kullanır .
Dış kaynak işlemeye bağlı eylemleri uygulamak için Eşzamansız Denetleyiciler kullanın .
Müşteri tarafı
Global yapılandırma
Razor kullanıyorsanız, varsayılan olarak global.asax.cs dosyasında aşağıdaki kodu ekleyin, Asp.Net MVC bir aspx motoru ve bir tıraş makinesi motoru ile oluşturulur. Bu sadece RazorViewEngine kullanır.
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
Web.config dosyasına gzip (HTTP sıkıştırma) ve statik önbellek (resimler, css, ...) ekleyin
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
Temel öneri, REST ilkelerini izlemektir ve aşağıdaki noktalar bu ilkelerin bazılarını ASP.NET MVC çerçevesine bağlar:
Kod Tırmanıcısı ve bu blog girişi , uygulamanın performansını artırmanın ayrıntılı yollarını sunar.
Derlenmiş sorgu uygulamanızın performansını artıracaktır, ancak ASP.NET MVC ile hiçbir ortak yanı yoktur. Her db uygulamasını hızlandıracak, bu yüzden gerçekten MVC ile ilgili değil.
Bu çok açık görünebilir, ancak sitenizi Hata Ayıklama modunda değil, üretim sırasında ve performans profili oluşturma sırasında Yayınlama modunda çalıştırın. Serbest bırakma modu çok daha hızlı. Hata ayıklama modu, kendi kodunuzdaki performans sorunlarını gizleyebilir.
LINQ aracılığıyla verilere erişirken IQueryable'a güvenebilirsiniz ...
List () yerine neden AsQueryable () kullanılır?
... ve iyi bir Havuz modelinden yararlanın:
Depo Deseninde Alt Kayıtları Yükleme
Bu, yalnızca gereken verilerin yüklenmesini ve yalnızca gerektiğinde veri erişimini optimize eder.
Dünyayı parçalayan bir optimizasyon değil, ama bunu orada atacağımı düşündüm - jQuery, vb . İçin CDN'leri kullanın .
ScottGu'dan alıntı: Microsoft Ajax CDN , ASP.NET Web Formları ve ASP.NET AJAX veya jQuery kullanan ASP.NET MVC uygulamalarının performansını önemli ölçüde artırmanıza olanak tanır. Hizmet ücretsizdir, herhangi bir kayıt gerektirmez ve hem ticari hem de ticari olmayan amaçlar için kullanılabilir.
CDN'yi Moss'ta jQuery kullanan web sitelerimiz için bile kullanıyoruz.
Ayrıca NHibernate kullanıyorsanız , sorgular için ikinci düzey önbelleği açabilir ve ayarlayabilir ve sorgu kapsamına ve zaman aşımına ekleyebilirsiniz. Ve EF , L2S ve NHibernate için kick ass profiller var - http://hibernatingrhinos.com/products/UberProf . Sorgularınızı ayarlamanıza yardımcı olacaktır.
Ayrıca ekleyeceğim:
Sprite kullanın : Sprite bir isteği azaltmak için harika bir şeydir. Tüm resimlerinizi tek bir görüntüde birleştirir ve hareketli grafiğin iyi bir kısmına ulaşmak için CSS kullanırsınız. Microsoft bunu yapmak için iyi bir kütüphane sağlar: Sprite ve Image Optimization Preview 4 .
Sunucu nesnenizi önbelleğe alma : Nadiren değişen bazı referans listeleriniz veya verileriniz varsa, her seferinde veritabanını sorgulamak yerine bunları önbelleğe alabilirsiniz.
Entity Framework yerine ADO.NET kullanın : EF4 or EF5
geliştirme süresini azaltmak için mükemmeldir, ancak optimize etmek acı verici olacaktır. Saklı bir yordamı en iyi duruma getirmek Entity Framework'ten daha kolaydır . Bu yüzden mağaza prosedürlerini mümkün olduğunca kullanmalısınız. Dapper, SQL'i çok iyi bir performansla sorgulamak ve eşlemek için basit bir yol sağlar.
Sayfayı Önbellek veya kısmi sayfa : MVC, sayfayı bazı parametrelere göre önbelleğe almak için bazı kolay filtreler sağlar, bu nedenle kullanın.
Veritabanı çağrılarını azaltma : Birden çok nesne döndüren benzersiz bir veritabanı isteği oluşturabilirsiniz. Dapper web sitesinde kontrol edin.
Her zaman temiz bir mimariye sahip olun : Küçük bir projede bile temiz bir n-katlı mimariye sahip olun. Kodunuzu temiz tutmanıza yardımcı olacak ve gerekirse kodu optimize etmek daha kolay olacaktır.
Varsayılan olarak birçok performans iyileştirmesi ile sizin için temiz bir mimari oluşturacak olan " Neos-SDI MVC Şablonu " şablonuna göz atabilirsiniz ( MvcTemplate web sitesini kontrol edin ).
Sunucu tarafında uygulamanızı optimize etmeye ilişkin tüm harika bilgilere ek olarak, YSlow'a bir göz atmanız gerektiğini söyleyebilirim . İstemci tarafında site performansını artırmak için mükemmel bir kaynaktır.
Bu yalnızca ASP.NET MVC için değil, tüm siteler için geçerlidir.
Yapılması gereken süper kolay bir şey, sayfa için istediğiniz verilere erişirken eşzamansız düşünmektir. Bir web hizmetinden, dosyadan, veri tabanından veya başka bir şeyden okumak için, zaman uyumsuz modeli mümkün olduğunca kullanın. Herhangi bir sayfanın daha hızlı olmasına yardımcı olmayacak olsa da, sunucunuzun genel olarak daha iyi performans göstermesine yardımcı olacaktır.
1: Zamanlamaları Al. Yavaşlamanın nerede olduğunu öğrenene kadar, soru cevaplamak için çok geniştir. Üzerinde çalıştığım bir projede bu kesin problem var; Bazı şeylerin ne kadar sürdüğünü bile bilmenin bir kaydı yoktur; biz sadece projeye zamanlama ekleyene kadar uygulamanın yavaş bölümlerini tahmin edebilirsiniz.
2: Sıralı işlemleriniz varsa, hafifçe çok iş parçacığından korkmayın. Özellikle engelleme işlemleri söz konusuysa. PLINQ burada senin arkadaşın.
3: Yayınlarken MVC Görüntülemelerinizi önceden oluşturun ... Bu, 'ilk sayfa isabeti'nin bazılarına yardımcı olacaktır
4: Bazıları saklı yordam / ADO hızının avantajlarını savunur. Diğerleri EF'in gelişim hızını ve katmanların daha net bir şekilde ayrılmasını ve amaçlarını savunurlar. SQL ve veri alma ve depolama için Sprocs / Views kullanmak için geçici çözümler olduğunda gerçekten yavaş tasarımlar gördüm. Ayrıca, test etme zorluğunuz artar. ADO'dan EF'e dönüştürdüğümüz mevcut kod tabanımız, eski Elle Haddelenmiş modelden daha kötü (ve bazı durumlarda daha iyi) performans göstermiyor.
5: Bu dedi, ısınma uygulaması düşünün. EF performans sorunlarımızın çoğunu ortadan kaldırmak için yaptığımız şeylerden biri, özel bir ısınma yöntemi eklemekti. Herhangi bir sorguyu veya herhangi bir şeyi önceden derlemez, ancak meta veri yükleme / oluşturma işlemlerinin çoğuna yardımcı olur. Bu, Code First modelleri ile uğraşırken daha da önemli olabilir.
6: Diğerlerinin söylediği gibi, Oturum durumunu veya mümkünse ViewState'i kullanmayın. Bunlar, geliştiricilerin düşündüğü performans optimizasyonları değildir, ancak daha karmaşık web uygulamaları yazmaya başladıktan sonra yanıt vermek istersiniz. Oturum durumu bunu engeller. Uzun süren bir sorgu düşünün. Yeni bir pencere açmaya ve daha az karmaşık bir pencere açmaya karar veriyorsunuz. Oturum durumu açıkken de beklemiş olabilirsiniz, çünkü sunucu o oturum için bir sonrakine geçmeden önce ilk istek tamamlanana kadar bekler.
7: Veritabanına gidiş-dönüş gezileri en aza indirin. Sık kullandığınız ancak gerçekçi bir şekilde .Net Önbelleğinize değişmeyecek öğeleri kaydedin. Eklerinizi / güncellemelerinizi mümkünse toplu olarak deneyin.
7.1: Ustura görünümlerinizde çok iyi bir neden olmadan Veri Erişim kodundan kaçının. Görmeseydim bunu söylemezdim. Modeli bir araya getirirken verilerine zaten erişiyorlardı, neden modelde yer almıyorlardı?
Sadece benim 2 sent eklemek istedim. Bir MVC uygulamasında URL yolu oluşturmayı optimize etmenin EN etkili yolu ... onları hiç üretmemek.
Çoğumuz uygulamalarımızda URL'lerin nasıl oluşturulduğunu az çok biliyoruz, bu yüzden mümkün Url.Content("~/Blahblah")
olan Url.Action()
veya yerine statik kullanarak yalnızca Url.RouteUrl()
diğer yöntemleri neredeyse 20 kat ve hatta daha fazla yeniyoruz.
PS. Ben bin yineleme çiftin bir kriter ran ve sonuçları gönderdiniz blogumda ilgi.
İstemcinizi optimize etmek için yaylanızda veritabanı katmanını unutmayın. Bir gecede 50 saniyeye kadar yükleme yapmak için 5 saniyeden başlayan bir uygulamamız vardı.
İncelemede bir sürü şema değişikliği yapmıştık. İstatistikleri yenilediğimizde, aniden eskisi kadar duyarlı hale geldi.
Aşağıdakiler yapılacaklar
ASP.NET MVC uygulamanızı Microsoft Azure'da (IaaS veya PaaS) çalıştırıyorsanız, en azından ilk dağıtımdan önce aşağıdakileri yapın.
Yukarıdaki tüm cevapları yaptım ve sorunumu çözmedi.
Son olarak, ayar ile benim yavaş sitesi yükleme sorunu çözüldü PrecompileBeforePublish içinde Profili Yayınla için gerçek . Msbuild kullanmak istiyorsanız bu bağımsız değişkeni kullanabilirsiniz:
/p:PrecompileBeforePublish=true
Gerçekten çok yardımcı oluyor. Şimdi MVC ASP.NET'im 10 kat daha hızlı yükleniyor.