คุณปรับปรุงประสิทธิภาพแอปพลิเคชัน ASP.NET MVC อย่างไร
คุณปรับปรุงประสิทธิภาพแอปพลิเคชัน ASP.NET MVC อย่างไร
คำตอบ:
รายการที่รวบรวมแหล่งที่เป็นไปได้ของการปรับปรุงอยู่ด้านล่าง:
ทั่วไป
เก็บเอาไว้
CompiledQuery.Compile()
หลีกเลี่ยงการคอมไพล์นิพจน์แบบสอบถามซ้ำOutputCacheAttribute
เพื่อบันทึกที่ไม่จำเป็นและการดำเนินการกระทำActionResult
วิธีการกำหนดเองของคุณหากจำเป็นRouteName
เพื่อจัดระเบียบเส้นทางของคุณจากนั้นใช้เพื่อสร้างลิงก์ของคุณและพยายามไม่ใช้วิธีนิพจน์แบบทรีของ ActionLinkPartialViews
หลีกเลี่ยงการแสดงมันxxxxครั้ง: หากคุณเรียกส่วนที่เหมือนกัน 300 ครั้งในมุมมองเดียวกันอาจมีบางอย่างผิดปกติ คำอธิบายและมาตรฐานเส้นทาง
ใช้Url.RouteUrl("User", new { username = "joeuser" })
เพื่อระบุเส้นทาง ASP.NET MVC Perfomance โดย Rudi Benkovic
การแก้ไขเส้นทางแคชโดยใช้ตัวช่วยUrlHelperCached
ASP.NET MVC Perfomance โดย Rudi Benkovic
ความปลอดภัย
DAL
โหลดบาลานซ์
ใช้พร็อกซีย้อนกลับเพื่อกระจายโหลดไคลเอ็นต์ทั่วทั้งอินสแตนซ์แอปของคุณ (Stack Overflow ใช้HAProxy ( MSDN )
ใช้Asynchronous Controllersเพื่อใช้งานการกระทำที่ขึ้นอยู่กับการประมวลผลทรัพยากรภายนอก
ด้านลูกค้า
การกำหนดค่าทั่วโลก
หากคุณใช้มีดโกนให้เพิ่มรหัสต่อไปนี้ใน global.asax.cs ของคุณตามค่าเริ่มต้น Asp.Net MVC จะแสดงผลด้วยเอ็นจิ้น aspx และเอ็นจิ้นมีดโกน สิ่งนี้ใช้ RazorViewEngine เท่านั้น
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
เพิ่ม gzip (การบีบอัด HTTP) และแคชแบบคงที่ (ภาพ, css, ... ) ใน web.config ของคุณ
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
คำแนะนำพื้นฐานคือการปฏิบัติตามหลักการ RESTและประเด็นต่อไปนี้เชื่อมโยงหลักการบางอย่างกับกรอบงาน ASP.NET MVC:
Code Climberและรายการบล็อกนี้ให้วิธีการอย่างละเอียดในการเพิ่มประสิทธิภาพของแอปพลิเคชัน
แบบสอบถามที่คอมไพล์จะเพิ่มประสิทธิภาพการทำงานของแอปพลิเคชันของคุณ แต่ไม่มีอะไรเหมือนกันกับ ASP.NET MVC มันจะเพิ่มความเร็วในทุกแอ็พพลิเคชัน db ดังนั้นจึงไม่เกี่ยวกับ MVC
สิ่งนี้อาจดูเหมือนชัดเจน แต่เรียกใช้ไซต์ของคุณในโหมด Release ไม่ใช่โหมด Debug เมื่ออยู่ระหว่างการผลิตและในระหว่างการทำโปรไฟล์ประสิทธิภาพ โหมดการเปิดตัวเป็นมากได้เร็วขึ้น โหมดแก้ไขข้อบกพร่องสามารถซ่อนปัญหาด้านประสิทธิภาพในรหัสของคุณเอง
เมื่อเข้าถึงข้อมูลผ่าน LINQ ต้องพึ่งพา IQueryable ...
เหตุใดจึงต้องใช้ AsQueryable () แทนที่จะเป็น List ()
... และยกระดับรูปแบบพื้นที่เก็บข้อมูลที่ดี:
การโหลดบันทึกย่อในรูปแบบที่เก็บ
สิ่งนี้จะเพิ่มประสิทธิภาพการเข้าถึงข้อมูลเพื่อให้แน่ใจว่ามีการโหลดข้อมูลที่จำเป็นเท่านั้นและเมื่อจำเป็นเท่านั้น
ไม่ได้เป็นการเพิ่มประสิทธิภาพที่ทำให้แผ่นดินไหว แต่ฉันคิดว่าฉันโยนออกนี้มี - ใช้ CDN สำหรับ jQuery ฯลฯ
อ้างจาก ScottGu ตัวเอง: Microsoft Ajax CDNช่วยให้คุณสามารถปรับปรุงประสิทธิภาพของ ASP.NET Web Forms และ ASP.NET MVC applications ที่ใช้ ASP.NET AJAX หรือ jQuery บริการนี้ฟรีไม่ต้องลงทะเบียนใด ๆ และสามารถใช้ได้ทั้งในเชิงพาณิชย์และไม่ใช่เพื่อการค้า
เรายังใช้ CDN สำหรับ webparts ของเราในมอสที่ใช้ jQuery
นอกจากนี้หากคุณใช้NHibernateคุณสามารถเปิดและตั้งค่าแคชระดับที่สองเพื่อสอบถามและเพิ่มลงในขอบเขตแบบสอบถามและหมดเวลา และมีเตะตูด Profiler สำหรับEF , L2S และ NHibernate - http://hibernatingrhinos.com/products/UberProf มันจะช่วยในการปรับแต่งแบบสอบถามของคุณ
ฉันจะเพิ่ม:
ใช้สไปรต์ : สไปรท์เป็นสิ่งที่ยอดเยี่ยมในการลดคำขอ คุณรวมภาพทั้งหมดของคุณเป็นภาพเดียวและใช้ CSS เพื่อเป็นส่วนหนึ่งของผีสาง ไมโครซอฟท์ยังมีห้องสมุดที่ดีที่จะทำมัน: สไปรท์และเพิ่มประสิทธิภาพของภาพดูตัวอย่าง 4
แคชวัตถุเซิร์ฟเวอร์ของคุณ : หากคุณมีรายการอ้างอิงหรือข้อมูลที่จะเปลี่ยนแปลงได้ไม่บ่อยนักคุณสามารถแคชข้อมูลเหล่านั้นลงในหน่วยความจำแทนการสืบค้นฐานข้อมูลทุกครั้ง
ใช้ ADO.NET แทน Entity Framework : EF4 or EF5
เป็นวิธีที่ดีในการลดเวลาในการพัฒนา แต่จะเจ็บปวดในการปรับให้เหมาะสม การเพิ่มประสิทธิภาพของโพรซีเดอร์ที่เก็บนั้นง่ายกว่า Entity Framework ดังนั้นคุณควรใช้ขั้นตอนการจัดเก็บมากที่สุด Dapper ให้วิธีง่ายๆในการสืบค้นและแมป SQL ด้วยประสิทธิภาพที่ดีมาก
หน้าแคชหรือหน้าบางส่วน : MVC มีตัวกรองแคชหน้าง่ายตามพารามิเตอร์บางตัวใช้งานได้
ลดการเรียกฐานข้อมูล : คุณสามารถสร้างคำขอฐานข้อมูลที่ไม่ซ้ำกันซึ่งส่งกลับวัตถุหลายรายการ ตรวจสอบเว็บไซต์ Dapper
มีสถาปัตยกรรมที่สะอาดอยู่เสมอ : มีสถาปัตยกรรม n-tiers ที่สะอาดแม้ในโครงการขนาดเล็ก มันจะช่วยให้คุณรักษาโค้ดของคุณให้สะอาดและมันจะง่ายขึ้นถ้าปรับให้เหมาะสม
คุณสามารถดูเทมเพลตนี้ "เทมเพลตNeos-SDI MVC " ซึ่งจะสร้างสถาปัตยกรรมที่สะอาดสำหรับคุณด้วยการปรับปรุงประสิทธิภาพเป็นจำนวนมากโดยค่าเริ่มต้น (ตรวจสอบ เว็บไซต์MvcTemplate )
สิ่งหนึ่งที่ง่ายสุด ๆ คือการคิดแบบอะซิงโครนัสเมื่อเข้าถึงข้อมูลที่คุณต้องการสำหรับหน้า ไม่ว่าจะเป็นการอ่านจากบริการบนเว็บไฟล์ฐานข้อมูลหรืออย่างอื่นให้ใช้โมเดล async ให้มากที่สุด แม้ว่ามันจะไม่ช่วยให้หน้าใดหน้าหนึ่งเร็วขึ้น แต่มันจะช่วยให้เซิร์ฟเวอร์ของคุณทำงานได้โดยรวมดีขึ้น
1: รับการกำหนดเวลา จนกว่าคุณจะรู้ว่าการชะลอตัวอยู่ที่ไหนคำถามนั้นกว้างเกินกว่าจะตอบได้ โครงการที่ฉันกำลังดำเนินการมีปัญหาที่แน่นอนนี้ ไม่มีการบันทึกที่จะรู้ว่าต้องใช้เวลานานเท่าใด เราสามารถเดาได้ว่าเป็นส่วนที่ช้าของแอพจนกว่าเราจะเพิ่มการกำหนดเวลาในโครงการ
2: ถ้าคุณมีการดำเนินการตามลำดับอย่ากลัวที่จะ multithread เบา ๆ โดยเฉพาะอย่างยิ่งหากมีการบล็อกการดำเนินงานที่เกี่ยวข้อง PLINQ เป็นเพื่อนของคุณที่นี่
3: จัดเตรียมมุมมอง MVC ของคุณล่วงหน้าเมื่อเผยแพร่ ... ที่จะช่วยให้มี 'การเข้าชมหน้าแรก' บางส่วน
4: บางคนแย้งสำหรับขั้นตอนการจัดเก็บ / ADO ข้อดีของความเร็ว บางคนแย้งว่าความเร็วในการพัฒนาของ EF และการแยกชั้นและวัตถุประสงค์ที่ชัดเจนยิ่งขึ้น ฉันเห็นการออกแบบที่ช้ามากเมื่อ SQL และวิธีแก้ไขปัญหาในการใช้ Sprocs / Views เพื่อดึงข้อมูลและจัดเก็บ นอกจากนี้ความยากในการทดสอบของคุณก็เพิ่มขึ้นเช่นกัน codebase ปัจจุบันของเราที่เราแปลงจาก ADO เป็น EF จะไม่ทำงานแย่ลง (และในบางกรณีดีกว่า) กว่ารุ่น Hand-Rolled แบบเก่า
5: ที่กล่าวว่าคิดเกี่ยวกับการสมัคร Warmup ส่วนหนึ่งของสิ่งที่เราทำเพื่อช่วยขจัดความบกพร่องในการทำงานของ EF ส่วนใหญ่คือการเพิ่มวิธีการอุ่นเครื่องพิเศษ มันไม่ได้คอมไพล์แบบสอบถามหรือสิ่งใด ๆ ล่วงหน้า แต่ช่วยได้มากกับการโหลด / การสร้างข้อมูลเมตา สิ่งนี้มีความสำคัญยิ่งขึ้นเมื่อต้องรับมือกับ Code First models
6: ตามที่คนอื่นพูดอย่าใช้สถานะเซสชันหรือ ViewState ถ้าเป็นไปได้ พวกเขาไม่จำเป็นต้องปรับปรุงประสิทธิภาพที่นักพัฒนาคิด แต่เมื่อคุณเริ่มเขียนเว็บแอปพลิเคชันที่ซับซ้อนมากขึ้นคุณต้องการการตอบสนอง สถานะเซสชันห้ามสิ่งนี้ ลองนึกภาพแบบสอบถามที่ใช้เวลานาน คุณตัดสินใจที่จะเปิดหน้าต่างใหม่และลองใช้หน้าต่างที่ซับซ้อนน้อยกว่า คุณอาจรอสถานะเซสชันเนื่องจากเซิร์ฟเวอร์จะรอจนกว่าการร้องขอแรกจะเสร็จสิ้นก่อนที่จะย้ายไปยังเซสชันถัดไปสำหรับเซสชันนั้น
7: ย่อการเดินทางไปยังฐานข้อมูลให้น้อยที่สุด บันทึกสิ่งที่คุณใช้บ่อย แต่จะไม่เปลี่ยนเป็นแคช. Net ของคุณแบบสมจริง ลองแบตช์แทรก / อัปเดตของคุณหากเป็นไปได้
7.1: หลีกเลี่ยงรหัสการเข้าถึงข้อมูลในมุมมองมีดโกนของคุณโดยไม่มีเหตุผลดี ฉันจะไม่พูดสิ่งนี้ถ้าฉันไม่เห็นมัน พวกเขากำลังเข้าถึงข้อมูลของพวกเขาอยู่แล้วเมื่อรวมโมเดลเข้าด้วยกันทำไมพวกเขาถึงไม่รวมมันไว้ในโมเดล?
แค่อยากจะเพิ่ม 2 เซนต์ของฉัน วิธีที่มีประสิทธิภาพที่สุดในการเพิ่มประสิทธิภาพการสร้างเส้นทาง URL ในแอปพลิเคชัน MVC คือ ... ไม่สร้างขึ้นมาเลย
พวกเราส่วนใหญ่รู้มากขึ้นหรือน้อยลงว่าสร้าง URL ในแอพของเราได้อย่างไรดังนั้นเพียงแค่ใช้สแตติกUrl.Content("~/Blahblah")
แทนUrl.Action()
หรือUrl.RouteUrl()
ที่เป็นไปได้เต้นวิธีอื่นทั้งหมดเกือบ 20 ครั้งและมากกว่านั้น
PS ฉันใช้มาตรฐานซ้ำสองพันรอบแล้วโพสต์ผลลัพธ์ในบล็อกของฉันหากสนใจ
ในเสียงโห่ร้องของคุณเพื่อเพิ่มประสิทธิภาพด้านลูกค้าอย่าลืมเกี่ยวกับเลเยอร์ฐานข้อมูล เรามีแอพพลิเคชั่นที่เปลี่ยนจาก 5 วินาทีเพื่อโหลดได้สูงสุด 50 วินาทีในชั่วข้ามคืน
ในการตรวจสอบเราได้ทำการเปลี่ยนแปลงสคีมาทั้งหมด เมื่อเรารีเฟรชสถิติมันก็จะตอบสนองเหมือนเมื่อก่อน
ต่อไปนี้เป็นสิ่งที่ต้องทำ
การใช้ Bundling และ Minification ช่วยให้คุณปรับปรุงประสิทธิภาพได้ โดยทั่วไปจะช่วยลดเวลาในการโหลดหน้า
หากคุณกำลังเรียกใช้แอปพลิเคชัน ASP.NET MVC ของคุณบน Microsoft Azure (IaaS หรือ PaaS) ให้ทำอย่างน้อยต่อไปนี้ก่อนการปรับใช้ครั้งแรก
ใช้Task Parallel Library (TPL)เวอร์ชันล่าสุดตามรุ่น. Net ต้องเลือกโมดูลที่ถูกต้องของ TPL เพื่อวัตถุประสงค์ที่แตกต่างกัน
ฉันทำทุกคำตอบข้างต้นและมันก็ไม่ได้แก้ปัญหาของฉัน
สุดท้ายผมแก้ปัญหาโหลดเว็บไซต์ของฉันช้ากับการตั้งค่าPrecompileBeforePublishในการเผยแพร่ข้อมูลส่วนตัวเพื่อความจริง หากคุณต้องการใช้msbuildคุณสามารถใช้อาร์กิวเมนต์นี้:
/p:PrecompileBeforePublish=true
มันช่วยได้มากจริงๆ ตอนนี้ MVC ASP.NET ของฉันโหลดเร็วขึ้น 10 เท่า