ASP.NET MVC uygulama performansını nasıl artırabilirim?


Yanıtlar:


311

Olası iyileştirme kaynaklarının derlenmiş bir listesi aşağıdadır:

Genel

  • Uygulamanızdaki bellek sızıntılarını ve performans sorunlarını keşfetmek için bir profil oluşturucudan yararlanın. şahsen dotTrace'i öneriyorum
  • Sitenizi üretim sırasında ve performans profili oluşturma sırasında Hata Ayıklama modunda değil Yayın modunda çalıştırın. Serbest bırakma modu çok daha hızlı. Hata ayıklama modu, kendi kodunuzdaki performans sorunlarını gizleyebilir.

Önbelleğe almak

  • CompiledQuery.Compile() Sorgu ifadelerinizin yeniden derlenmesinden kaçınarak tekrar tekrar kullanın
  • OutputCacheAttribute Gereksiz ve eylem yürütmelerini kaydetmek için değiştirilmeye eğilimli olmayan içeriği önbellekle
  • Sık erişilen hassas olmayan bilgiler için çerezleri kullanın
  • Yararlanın ETAGların ve son kullanma - özel yaz ActionResultgerekirse yöntemleri
  • Kullanmayı düşünün RouteNameRotanı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.
  • Bir rota çözünürlüğü önbellek stratejisi uygulamayı düşünün
  • Yinelenen kodu içine yerleştirin 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 Deneyler

Yönlendirme

Güvenlik

  • Form Kimlik Doğrulamasını Kullanın, Sık erişilen hassas verilerinizi kimlik doğrulama biletinde saklayın

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ı

  • Müşteri tarafınızı optimize edin, performansı artırmak için öneriler için YSlow gibi bir araç kullanın
  • Kullanıcı arayüzünüzün bileşenlerini güncellemek için AJAX kullanın, mümkünse tam sayfa güncellemesinden kaçının.
  • Zaman aşımına dayalı olarak yeniden yüklemeye karşı içerik dağıtımı için bir pub-sub mimarisi (Comie Comet) uygulamayı düşünün.
  • Grafik ve grafik oluşturma mantığını mümkünse istemci tarafına taşıyın. Grafik oluşturma pahalı bir faaliyettir. İstemci tarafına sunucunuzu gereksiz bir yükten ertelemek ve yeni bir istekte bulunmadan yerel olarak grafiklerle çalışmanıza izin verir (örn. Esnek grafik, jqbargraph , MoreJqueryCharts ).
  • İstemci tarafındaki yüklemeyi iyileştirmek için komut dosyaları ve medya içeriği için CDN'leri kullanın (ör. Google CDN )
  • Küçült - Derle - komut dosyası boyutunuzu iyileştirmek için JavaScript'iniz
  • Her istek üzerine çerezler sunucuya gönderildiği için çerez boyutunu küçük tutun.
  • Mümkünse DNS ve Link Prefetching kullanmayı düşünün .

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>

  • Kullanılmayan HTTP Modüllerini kaldırın
  • HTML'nizi oluşturulduğu anda (web.config dosyasında) temizleyin ve kullanmadığınızda görünüm durumunu devre dışı bırakın <pages buffer="true" enableViewState="false">

6
i örneğin IList üzerinden tahriş ve sonuç her liste öğesi için Render.PartialView ("Satır", öğe) çağırarak bir sonuç kümesi görüntüler bir görünümü varsa ben performans kaybetmek demek? ne kadar kaybederim? veya performans kazancını nasıl ölçebilirim?
marc.d

@SDReyes - pub-sub mimarisinin anlamı nedir?
Mohammed Zameer

1
Bu havalı. Uber Profiler bağlantısı öldü. Bu, bunun yerine ORM'ye özgü profilcilerden birine bağlanmalı mıdır?
shanabus

12

Temel öneri, REST ilkelerini izlemektir ve aşağıdaki noktalar bu ilkelerin bazılarını ASP.NET MVC çerçevesine bağlar:

  1. Denetleyicilerinizi vatansız hale getirin - bu daha çok ' Web performansı / ölçeklenebilirlik' önerisi (mikro / makine düzeyinde performansın aksine) ve uygulamalarınızı gelecekte etkileyecek önemli bir tasarım kararıdır - özellikle popüler hale gelmesi veya bazılarına ihtiyacınız olması durumunda örneğin hata toleransı.
    • Oturumları kullanma
    • Oturum kullanan tempdata kullanmayın
    • 'Her şeyi' erken 'önbelleklemeye' çalışmayın.
  2. Form Kimlik Doğrulamasını Kullan
    • Sık erişilen hassas verilerinizi kimlik doğrulama biletinde saklayın
  3. Sık erişilen hassas olmayan bilgiler için çerezleri kullanın
  4. Senin yapın kaynaklar önbelleklenemez web'de
  5. JavaScript'inizi derleyin. Bunu yapmak için Closure derleyici kütüphanesi de var ( başkaları da var, sadece 'JavaScript derleyici' için de arama yapın )
  6. CDN'leri (İçerik Dağıtım Ağı) kullanın - özellikle büyük medya dosyalarınız vb. İçin.
  7. Dosyalarınız, anahtar / değer depoları vb. Gibi verileriniz için farklı depolama türlerini göz önünde bulundurun - yalnızca SQL Server değil
  8. Son olarak, web sitenizi performans açısından test edin

10

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.


8

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.



6

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.


6

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.


Ayende geçtiğimiz günlerde EF Profiler'ın örnek bir MVC uygulamasını ayarlamasına nasıl yardımcı olduğu hakkında blog yazdı: ayende.com/Blog/archive/2010/05/17/…
Frank Schwieterman

5

Ayrıca ekleyeceğim:

  1. 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 .

  2. 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.

  3. Entity Framework yerine ADO.NET kullanın : EF4 or EF5geliş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.

  4. 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.

  5. Veritabanı çağrılarını azaltma : Birden çok nesne döndüren benzersiz bir veritabanı isteği oluşturabilirsiniz. Dapper web sitesinde kontrol edin.

  6. 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.

  7. 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 ).


Daha fazla sonuç kümesi döndüren bir saklı yordam çalıştırmak ve daha sonra zaman uyumsuz modda daha fazla saklı yordam çalıştırmak daha iyi olduğunu düşünüyor musunuz?
Muflix

4

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.


3

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.


2

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ı?


2
  1. Gzip uygulayın.
  2. Kısmi görünümler için eşzamansız oluşturma kullanın.
  3. Veritabanı isabetlerini en aza indirin.
  4. Derlenmiş bir sorgu kullanın.
  5. Bir profil oluşturup gereksiz isabetleri bulun. Yanıt döndürmek için 1 saniyeden uzun süren tüm saklı yordamları optimize edin.
  6. Önbellek kullanın.
  7. Grup küçültme optimizasyonunu kullanın .
  8. Salt okunur içerikler için oturum önbelleği ve yerel depolama gibi HTML 5 yardımcı programlarını kullanın.

2

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.


1

İ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.


0

Aşağıdakiler yapılacaklar

  1. Çekirdek modu Önbellek
  2. Boru hattı modu
  3. Kullanılmayan modülleri kaldırın
  4. runAllManagedModulesForAllRequests
  5. Wwwroot yazmayın
  6. Kullanılmayan görünüm motorlarını ve dilini kaldırın

0

Paketle ve Minimize'i kullanmak da performansı artırmanıza yardımcı olur. Temelde sayfa yükleme süresini azaltır.


0

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.

  • Her türlü kod borcu, çoğaltma, karmaşıklık ve güvenlik için kodunuzu statik kod analizörü ile tarayın.
  • Uygulamada gerçek zamanlı sorunları bulmak için her zaman Uygulama Sicili'ni etkinleştirin ve performansı, tarayıcıları ve analizleri sık sık izleyin.
  • Görüntüler, varlıklar, ortak düzenler vb. Gibi statik ve daha az sıklıkta değişiklik verileri için Azure Redis Önbelleği uygulayın.
  • Her zaman Azure tarafından sağlanan APM (Uygulama Performans Yönetimi) araçlarına güvenin.
  • Uygulamanın iç kısımları arasındaki iletişim performansını araştırmak için sık sık uygulama haritasına bakın.
  • Veritabanı / VM performansını da izleyin.
  • Gerekirse ve bütçe dahilinde Yük Dengeleyici'yi (Yatay Ölçek) kullanın.
  • Uygulamanızın tüm dünyada hedef kitlesi varsa, gelen isteği otomatik olarak ele almak ve en uygun uygulama örneğine yönlendirmek için Azure Trafic Manager'ı kullanın.
  • Düşük performansa dayalı uyarıları yazarak performans izlemeyi otomatikleştirmeye çalışın.

0

Net sürümüne göre Görev Paralel Kitaplığı'nın (TPL) en son sürümünü kullanın . Farklı amaçlar için doğru TPL modüllerini seçmek zorundasınız.


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.