Bagaimana cara meningkatkan kinerja aplikasi ASP.NET MVC?

Jawaban:

311

Daftar sumber perbaikan yang mungkin disusun adalah di bawah ini:

Umum

  • Manfaatkan profiler untuk menemukan kebocoran memori dan masalah kinerja di aplikasi Anda. secara pribadi saya sarankan dotTrace
  • 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.

Caching

  • Gunakan CompiledQuery.Compile() rekursif menghindari kompilasi ekspresi permintaan Anda
  • Tembolok tidak rawan untuk mengubah konten menggunakan OutputCacheAttribute untuk menyimpan eksekusi yang tidak perlu dan tindakan
  • Gunakan cookie untuk informasi non sensitif yang sering diakses
  • Memanfaatkan ETag dan kedaluwarsa - Tulis ActionResultmetode khusus Anda jika perlu
  • Pertimbangkan untuk menggunakan RouteNameuntuk mengatur rute Anda dan kemudian menggunakannya untuk menghasilkan tautan Anda, dan cobalah untuk tidak menggunakan metode ActionLink berbasis pohon ekspresi.
  • Pertimbangkan menerapkan strategi caching resolusi rute
  • Masukkan kode berulang di dalam Anda 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 Ukur

Rute

Keamanan

  • Gunakan Formulir Otentikasi, Simpan data sensitif Anda yang sering diakses di tiket otentikasi

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

  • Optimalkan sisi klien Anda, gunakan alat seperti YSlow untuk saran untuk meningkatkan kinerja
  • Gunakan AJAX untuk memperbarui komponen UI Anda, hindari pembaruan seluruh halaman jika memungkinkan.
  • Pertimbangkan untuk mengimplementasikan arsitektur pub-sub -ya Komet- untuk pengiriman konten terhadap pemuatan ulang berdasarkan batas waktu.
  • Pindahkan grafik dan pembuatan grafik logika ke sisi klien jika memungkinkan. Pembuatan grafik adalah kegiatan yang mahal. Menunda ke sisi klien server Anda dari beban yang tidak perlu, dan memungkinkan Anda untuk bekerja dengan grafik secara lokal tanpa membuat permintaan baru (mis. Flex charting, jqbargraph , MoreJqueryCharts ).
  • Gunakan CDN untuk skrip dan konten media untuk meningkatkan pemuatan di sisi klien (yaitu Google CDN )
  • Minify - Compile - JavaScript Anda untuk meningkatkan ukuran skrip Anda
  • Pertahankan ukuran cookie kecil, karena cookie dikirim ke server pada setiap permintaan.
  • Pertimbangkan untuk menggunakan DNS dan Prefetching Link jika memungkinkan.

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>

  • Hapus Modul HTTP yang tidak digunakan
  • Siram HTML Anda segera setelah dihasilkan (di web.config Anda) dan nonaktifkan kondisi tampilan jika Anda tidak menggunakannya <pages buffer="true" enableViewState="false">
SDReyes
sumber
6
tunggu maksudmu saya kehilangan kinerja ketika saya misalnya memiliki tampilan yang menampilkan hasil yang ditetapkan dengan menjengkelkan melalui IList dan memanggil Render.PartialView ("Row", item) untuk setiap item daftar? berapa kerugian saya? atau bagaimana saya bisa mengukur perolehan kinerja?
marc.d
@ SYDReyes - apa arti dari arsitektur pub-sub ?
Mohammed Zameer
1
Ini keren. Tautan Uber Profiler sudah mati. Apakah ini harus ditautkan dengan salah satu profiler spesifik ORM?
shanabus
12

Saran dasar adalah untuk mengikuti prinsip - prinsip REST dan poin-poin berikut mengikat beberapa prinsipal ini dengan kerangka kerja ASP.NET MVC:

  1. Buat pengendali Anda tidak memiliki kewarganegaraan - ini lebih merupakan saran ' Kinerja web / skalabilitas' (bukan kinerja tingkat mikro / mesin) dan keputusan desain utama yang akan memengaruhi aplikasi Anda di masa mendatang - terutama jika itu menjadi populer atau jika Anda memerlukan beberapa toleransi kesalahan misalnya.
    • Jangan gunakan Sesi
    • Jangan gunakan tempdata - yang menggunakan sesi
    • Jangan coba 'cache' semuanya 'sebelum waktunya'.
  2. Gunakan Formulir Otentikasi
    • Simpan data sensitif Anda yang sering diakses di tiket otentikasi
  3. Gunakan cookie untuk informasi non sensitif yang sering diakses
  4. Jadikan sumber daya Anda dapat diakses di web
  5. Kompilasi JavaScript Anda. Ada pustaka kompiler Penutupan untuk melakukannya juga (tentu ada yang lain, cukup cari 'kompiler JavaScript' juga)
  6. Gunakan CDN (Jaringan Pengiriman Konten) - terutama untuk file media besar Anda dan sebagainya.
  7. Pertimbangkan berbagai jenis penyimpanan untuk data Anda, misalnya, file, penyimpanan kunci / nilai, dll. - tidak hanya SQL Server
  8. Last but not least, uji kinerja situs web Anda
ziya
sumber
10

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.

LukLed
sumber
7

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.

Craig Stuntz
sumber
6

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.

Ta01
sumber
5

Saya juga akan menambahkan:

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

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

  3. Gunakan ADO.NET sebagai ganti Entity Framework : EF4 or EF5bagus 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.

  4. Halaman Cache atau halaman parsial : MVC menyediakan beberapa filter mudah untuk me-cache halaman berdasarkan beberapa parameter, jadi gunakan itu.

  5. Kurangi panggilan Database : Anda dapat membuat permintaan basis data unik yang mengembalikan banyak objek. Periksa situs web Dapper.

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

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

Jeff Lequeux
sumber
Apakah Anda pikir lebih baik menjalankan satu prosedur tersimpan yang mengembalikan set hasil lebih banyak daripada menjalankan lebih banyak prosedur tersimpan dalam mode async?
Muflix
4

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.

Steve Haigh
sumber
3

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

Tanpa Pengembalian Uang Tanpa Pengembalian
sumber
2

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?

to11mtm
sumber
2
  1. Terapkan Gzip.
  2. Gunakan render asinkron untuk tampilan sebagian.
  3. Minimalkan klik basis data.
  4. Gunakan kueri yang dikompilasi.
  5. Jalankan profiler dan cari tahu hits yang tidak perlu. Optimalkan semua prosedur tersimpan yang membutuhkan waktu lebih dari 1 detik untuk mengembalikan respons.
  6. Gunakan caching.
  7. Gunakan optimasi penggabungan bundling .
  8. Gunakan utilitas HTML 5 seperti cache sesi dan penyimpanan lokal untuk konten yang hanya bisa dibaca.
Vinayak
sumber
2

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.

Alex
sumber
1

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.

Robbie Dee
sumber
0

Berikut ini adalah hal-hal yang harus dilakukan

  1. Cache mode kernel
  2. Mode perpipaan
  3. Hapus modul yang tidak digunakan
  4. runAllManagedModulesForAllRequests
  5. Jangan menulis di wwwroot
  6. Hapus mesin dan bahasa tampilan yang tidak digunakan
Zahid Mustafa
sumber
0

Menggunakan Bundling dan Minifikasi juga membantu Anda meningkatkan kinerja. Ini pada dasarnya mengurangi waktu pemuatan halaman.

Neelima
sumber
0

Jika Anda menjalankan aplikasi ASP.NET MVC Anda pada Microsoft Azure (IaaS atau PaaS), maka lakukan hal berikut setidaknya sebelum penyebaran pertama.

  • Pindai kode Anda dengan penganalisis kode statis untuk semua jenis utang kode, duplikasi, kerumitan, dan untuk keamanan.
  • Selalu aktifkan Application Insight, dan pantau kinerja, browser, dan analitik sesering mungkin untuk menemukan masalah waktu-nyata dalam aplikasi.
  • Terapkan Azure Redis Cache untuk data perubahan statis dan kurang sering seperti Gambar, aset, tata letak umum dll.
  • Selalu mengandalkan alat APM (Manajemen Kinerja Aplikasi) yang disediakan oleh Azure.
  • Lihat peta aplikasi sesering mungkin untuk menyelidiki kinerja komunikasi antara bagian-bagian internal aplikasi.
  • Pantau kinerja Database / VM juga.
  • Gunakan Load Balancer (Skala Horisontal) jika diperlukan dan sesuai anggaran.
  • Jika aplikasi Anda memiliki audiens target di seluruh dunia, maka gunakan Azure Trafic Manager untuk secara otomatis menangani permintaan yang masuk dan mengalihkannya ke instance aplikasi yang paling tersedia.
  • Cobalah untuk mengotomatiskan pemantauan kinerja dengan menulis peringatan berdasarkan kinerja rendah.
Tahir Alvi
sumber
0

Gunakan versi terbaru dari Task Parallel Library (TPL) , menurut versi .Net. Harus memilih modul TPL yang benar untuk tujuan yang berbeda.

agileDev
sumber
0

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.

Amir Pourmand امیر پورمند
sumber