Jawaban:
Daftar sumber perbaikan yang mungkin disusun adalah di bawah ini:
Umum
Caching
CompiledQuery.Compile()
rekursif menghindari kompilasi ekspresi permintaan AndaOutputCacheAttribute
untuk menyimpan eksekusi yang tidak perlu dan tindakanActionResult
metode khusus Anda jika perluRouteName
untuk mengatur rute Anda dan kemudian menggunakannya untuk menghasilkan tautan Anda, dan cobalah untuk tidak menggunakan metode ActionLink berbasis pohon ekspresi.PartialViews
, hindari rendernya xxxx kali: jika Anda akhirnya memanggil parsial yang sama 300 kali dalam tampilan yang sama, mungkin ada yang salah dengan itu. Penjelasan dan Tolok UkurRute
Gunakan Url.RouteUrl("User", new { username = "joeuser" })
untuk menentukan rute. ASP.NET MVC Perfomance oleh Rudi Benkovic
Penyelesaian rute cache menggunakan pembantu ini UrlHelperCached
ASP.NET MVC Perfomance oleh Rudi Benkovic
Keamanan
DAL
Penyeimbang beban
Memanfaatkan proksi terbalik, untuk menyebarkan beban klien di seluruh instance aplikasi Anda. (Stack Overflow menggunakan HAProxy ( MSDN ).
Gunakan Pengontrol Asinkron untuk menerapkan tindakan yang bergantung pada pemrosesan sumber daya eksternal.
Sisi klien
Konfigurasi global
Jika Anda menggunakan Razor, tambahkan kode berikut di global.asax.cs Anda, secara default, Asp.Net MVC dirender dengan mesin aspx dan mesin pisau cukur. Ini hanya menggunakan RazorViewEngine.
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
Tambahkan gzip (kompresi HTTP) dan cache statis (gambar, css, ...) di web.config Anda
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
Saran dasar adalah untuk mengikuti prinsip - prinsip REST dan poin-poin berikut mengikat beberapa prinsipal ini dengan kerangka kerja ASP.NET MVC:
Code Climber dan entri blog ini menyediakan cara terperinci untuk meningkatkan kinerja aplikasi.
Query yang dikompilasi akan meningkatkan kinerja aplikasi Anda, tetapi tidak memiliki kesamaan dengan ASP.NET MVC. Ini akan mempercepat setiap aplikasi db, jadi ini bukan tentang MVC.
Ini mungkin tampak jelas, tetapi jalankan situs Anda dalam mode Rilis, bukan mode Debug, saat dalam produksi, dan juga selama pembuatan profil kinerja. Mode rilis jauh lebih cepat. Mode debug dapat menyembunyikan masalah kinerja dalam kode Anda sendiri.
Saat mengakses data melalui LINQ mengandalkan IQueryable ...
Mengapa menggunakan AsQueryable () bukan List ()?
... dan meningkatkan pola Repositori yang baik:
Memuat Subrecords dalam Pola Repositori
Ini akan mengoptimalkan akses data untuk memastikan hanya data yang dibutuhkan dimuat dan hanya saat itu diperlukan.
Bukan optimasi yang menghancurkan bumi, tapi saya pikir saya akan membuang ini di luar sana - Gunakan CDN untuk jQuery, dll .
Kutipan dari ScottGu sendiri: Microsoft Ajax CDN memungkinkan Anda untuk secara signifikan meningkatkan kinerja Formulir Web ASP.NET dan aplikasi ASP.NET MVC yang menggunakan ASP.NET AJAX atau jQuery. Layanan ini tersedia secara gratis, tidak memerlukan pendaftaran apa pun, dan dapat digunakan untuk tujuan komersial dan non-komersial.
Kami bahkan menggunakan CDN untuk halaman web kami di Moss yang menggunakan jQuery.
Juga jika Anda menggunakan NHibernate, Anda dapat menghidupkan dan mengatur cache level kedua untuk kueri dan menambah cakupan dan waktu tunggu kueri. Dan ada profiler kick ass untuk EF , L2S dan NHibernate - http://hibernatingrhinos.com/products/UberProf . Ini akan membantu untuk menyetel kueri Anda.
Saya juga akan menambahkan:
Gunakan Sprite : Sprite adalah hal hebat untuk mengurangi permintaan. Anda menggabungkan semua gambar Anda menjadi satu dan menggunakan CSS untuk mendapatkan sebagian dari sprite. Microsoft menyediakan perpustakaan yang baik untuk melakukannya: Sprite dan Image Optimization Preview 4 .
Cache Objek server Anda : Jika Anda memiliki beberapa daftar referensi atau data yang jarang berubah, Anda dapat menyimpannya di dalam memori alih-alih meminta database setiap waktu.
Gunakan ADO.NET sebagai ganti Entity Framework : EF4 or EF5
bagus untuk mengurangi waktu pengembangan, tetapi akan sulit untuk mengoptimalkannya. Lebih mudah untuk mengoptimalkan prosedur tersimpan daripada Entity Framework. Jadi, Anda harus menggunakan prosedur toko sebanyak mungkin. Dapper menyediakan cara sederhana untuk query dan memetakan SQL dengan kinerja yang sangat baik.
Halaman Cache atau halaman parsial : MVC menyediakan beberapa filter mudah untuk me-cache halaman berdasarkan beberapa parameter, jadi gunakan itu.
Kurangi panggilan Database : Anda dapat membuat permintaan basis data unik yang mengembalikan banyak objek. Periksa situs web Dapper.
Selalu memiliki arsitektur yang bersih : Memiliki arsitektur n-tier yang bersih, bahkan pada proyek kecil. Ini akan membantu Anda menjaga kode Anda tetap bersih, dan akan lebih mudah untuk mengoptimalkannya jika diperlukan.
Anda dapat melihat template ini " Neos-SDI MVC Template " yang akan membuat arsitektur bersih untuk Anda dengan banyak peningkatan kinerja secara default (lihat situs web MvcTemplate ).
Selain semua informasi hebat tentang pengoptimalan aplikasi Anda di sisi server, saya katakan Anda harus melihat YSlow . Ini adalah sumber yang luar biasa untuk meningkatkan kinerja situs di sisi klien.
Ini berlaku untuk semua situs, bukan hanya ASP.NET MVC.
Satu hal super mudah untuk dilakukan adalah berpikir secara tidak sinkron saat mengakses data yang Anda inginkan untuk halaman tersebut. Baik membaca dari layanan web, file, basis data, atau lainnya, gunakan model async sebanyak mungkin. Meskipun itu tidak selalu membantu satu halaman lebih cepat, itu akan membantu server Anda melakukan keseluruhan lebih baik
1: Dapatkan Pengaturan Waktu. Sampai Anda tahu di mana pelambatannya, pertanyaannya terlalu luas untuk dijawab. Sebuah proyek yang sedang saya kerjakan memiliki masalah yang tepat ini; Tidak ada penebangan untuk mengetahui berapa lama hal-hal tertentu; kita hanya bisa menebak bagian aplikasi yang lambat sampai kita menambahkan timing ke proyek.
2: Jika Anda memiliki operasi berurutan, Jangan takut untuk multithread ringan. TERUTAMA jika operasi pemblokiran terlibat. PLINQ adalah temanmu di sini.
3: Pregenerate Tampilan MVC Anda ketika Menerbitkan ... Itu akan membantu dengan beberapa 'hit halaman pertama'
4: Beberapa orang berpendapat untuk prosedur yang tersimpan / keuntungan kecepatan ADO. Yang lain berpendapat untuk kecepatan pengembangan EF dan pemisahan tingkatan yang lebih jelas dan tujuan mereka. Saya telah melihat desain yang sangat lambat ketika SQL dan solusi menggunakan Sprocs / Views untuk pengambilan data dan penyimpanan. Juga, kesulitan Anda untuk menguji naik. Basis kode kami saat ini yang kami konversi dari ADO ke EF tidak berkinerja lebih buruk (dan dalam beberapa kasus lebih baik) daripada model Hand-Rolled lama.
5: Dikatakan, Pikirkan tentang Pemanasan aplikasi. Bagian dari apa yang kami lakukan untuk membantu menghilangkan sebagian besar masalah kinerja EF kami adalah menambahkan metode pemanasan khusus. Itu tidak mengkompilasi pertanyaan atau apapun, tetapi membantu dengan banyak pemuatan / pembuatan metadata. Ini bisa menjadi lebih penting ketika berhadapan dengan model Code First.
6: Seperti yang orang lain katakan, Jangan gunakan status Sesi atau kondisi tampilan jika memungkinkan. Mereka belum tentu optimasi kinerja yang dipikirkan pengembang, tetapi begitu Anda mulai menulis aplikasi web yang lebih kompleks, Anda ingin responsif. Status sesi menghalangi ini. Bayangkan permintaan berjalan lama. Anda memutuskan untuk membuka jendela baru dan mencoba yang tidak terlalu rumit. Baiklah, Anda mungkin juga telah menunggu dengan status sesi aktif, karena server akan menunggu sampai permintaan pertama selesai sebelum pindah ke yang berikutnya untuk sesi itu.
7: Minimalkan round trip ke database. Simpan barang yang sering Anda gunakan tetapi tidak akan berubah secara realistis ke .Net Cache Anda. Cobalah untuk mengumpulkan sisipan / pembaruan Anda jika memungkinkan.
7.1: Hindari kode Akses Data dalam tampilan Razor Anda tanpa alasan yang kuat. Saya tidak akan mengatakan ini jika saya tidak melihatnya. Mereka sudah mengakses data mereka ketika menyatukan model, mengapa mereka tidak memasukkannya ke dalam model?
Hanya ingin menambahkan 2 sen saya. Cara paling efektif untuk mengoptimalkan pembuatan rute URL dalam aplikasi MVC adalah ... tidak menghasilkannya sama sekali.
Sebagian besar dari kita lebih atau kurang tahu bagaimana URL dihasilkan di aplikasi kita, jadi cukup gunakan statis Url.Content("~/Blahblah")
daripada Url.Action()
atau Url.RouteUrl()
jika mungkin, hajar semua metode lain hampir 20 kali dan bahkan lebih.
PS. Saya telah menjalankan patokan beberapa ribu iterasi dan memposting hasilnya di blog saya jika tertarik.
Dalam tuntutan Anda untuk mengoptimalkan sisi klien, jangan lupa tentang lapisan basis data. Kami memiliki aplikasi yang beroperasi dari 5 detik untuk memuat hingga 50 detik dalam semalam.
Saat diperiksa, kami telah membuat banyak perubahan skema. Begitu kami me-refresh statistik, tiba-tiba menjadi responsif seperti sebelumnya.
Berikut ini adalah hal-hal yang harus dilakukan
Jika Anda menjalankan aplikasi ASP.NET MVC Anda pada Microsoft Azure (IaaS atau PaaS), maka lakukan hal berikut setidaknya sebelum penyebaran pertama.
Saya melakukan semua jawaban di atas dan itu tidak menyelesaikan masalah saya.
Akhirnya, saya memecahkan masalah pemuatan situs lambat saya dengan menetapkan PrecompileBeforePublish di Profil Penerbit menjadi true . Jika Anda ingin menggunakan msbuild, Anda dapat menggunakan argumen ini:
/p:PrecompileBeforePublish=true
Ini sangat membantu. Sekarang MVC ASP.NET saya memuat 10 kali lebih cepat.