Hiệu suất ASP.NET MVC


102

Tôi đã tìm thấy một số nhận xét hoang dã rằng ASP.NET MVC nhanh hơn 30 lần so với ASP.NET WebForms. Sự khác biệt về hiệu suất thực sự là gì, điều này đã được đo lường chưa và lợi ích về hiệu suất là gì.

Điều này là để giúp tôi xem xét việc chuyển từ ASP.NET WebForms sang ASP.NET MVC.


20
Sau khi làm việc với WebForms kể từ khi họ ra mắt, tôi sẽ không bao giờ sẵn sàng quay lại! MVC đã đánh cắp <3 của tôi - và trang web này đang chạy tuyệt vời trên bản Beta 5!
Jarrod Dixon

2
Điều gì với tất cả các bản khôi phục về câu hỏi này ..?
Nick

@Nick: OP đang quay lại bất kỳ chỉnh sửa nào và xóa mọi nhận xét giải thích chúng.
GEOCHET

@Rich B: Đúng, anh ấy đã xóa khoảng 5 bình luận của tôi.
George Stocker

2
Cần cập nhật ngay bây giờ vì chúng tôi sắp phát hành MVC3.
Andrew Lewis

Câu trả lời:


69

Chúng tôi đã không thực hiện loại kiểm tra khả năng mở rộng và hiệu suất cần thiết để đưa ra bất kỳ kết luận nào. Tôi nghĩ rằng ScottGu có thể đã thảo luận về các mục tiêu hiệu suất tiềm năng. Khi chúng tôi hướng tới Beta và RTM, chúng tôi sẽ tiến hành thử nghiệm nội bộ nhiều hơn. Tuy nhiên, tôi không chắc chính sách của chúng tôi về việc xuất bản kết quả kiểm tra hiệu suất là gì.

Trong mọi trường hợp, bất kỳ thử nghiệm nào như vậy thực sự cần phải xem xét các ứng dụng trong thế giới thực ...


13
Bây giờ MVC đã được phát hành, có bất kỳ cập nhật nào về việc công bố kết quả perf không?
chris

6
Chỉ bỏ phiếu cho cái này vì số điểm đại diện 5.999 trước đó đã làm tôi đau mắt :(
Damien

2
Đến lúc này, chắc chắn bạn phải có một số con số. Muốn cập nhật câu trả lời của bạn? Hoặc bạn có thấy rằng chính sách pesky cấm nó?
tvanfosson

7
Con số là 42. :) Nói chung, các con số của chúng tôi có thể sẽ vô dụng đối với các ứng dụng trong thế giới thực vì vậy chúng tôi không đưa ra quy luật. Tuy nhiên, tôi biết các đội khác tại Microsoft đang xây dựng các trang web quy mô lớn, những người cho thấy những con số thuận lợi. Nói cách khác, mọi vấn đề về hiệu suất có nhiều khả năng là do lỗi của lập trình viên hơn bất kỳ vấn đề kế thừa nào trong khuôn khổ. Thông thường, các tương tác với cơ sở dữ liệu và các dịch vụ bên ngoài là thủ phạm. :)
Haacked

Thật! Hãy cập nhật điều này! Có thể không phải điểm chuẩn mà là một ý tưởng ngắn gọn, chúng ngang bằng hay mvc tốt hơn một chút về hiệu suất?
gideon

48

Tôi nghĩ rằng đây sẽ là một câu hỏi khó để trả lời dứt khoát vì rất nhiều sẽ phụ thuộc vào A) cách bạn triển khai ứng dụng WebForms và B) cách bạn triển khai ứng dụng MVC. Ở dạng "thô", MVC có thể nhanh hơn WebForms, nhưng hàng năm trời các công cụ và kinh nghiệm đã tạo ra một số kỹ thuật để xây dựng các ứng dụng WebForms nhanh. Tôi sẵn sàng đặt cược rằng một nhà phát triển ASP.NET cấp cao có thể tạo ra một ứng dụng WebForms có tốc độ cạnh tranh với bất kỳ ứng dụng MVC nào- hoặc ít nhất là đạt được sự khác biệt không đáng kể.

Sự khác biệt thực sự - như @tvanfosson đề xuất - là ở khả năng kiểm tra và SoC sạch. Nếu cải thiện hiệu suất là mối quan tâm hàng đầu của bạn, thì tôi không nghĩ đó là lý do tuyệt vời để nhảy vào WebForms và bắt đầu xây dựng lại trong MVC. Ít nhất là cho đến khi bạn đã thử các kỹ thuật có sẵn để tối ưu hóa WebForms.


Câu trả lời tuyệt vời Todd (ngạc nhiên làm sao đối với một nhà truyền bá phúc âm cho nhà phát triển thực sự có một phản ứng thực dụng). Điều duy nhất bạn sai là trong biểu mẫu web triển khai thô thực sự nhanh hơn đáng kể.
Chris Marisic

42

Nó đã giảm một trong các trang của tôi từ tải trọng 2MB xuống còn 200k, chỉ bằng cách loại bỏ trạng thái xem và làm cho nó có thể hoạt động theo chương trình với đầu ra đã gửi.

Chỉ riêng kích thước, mặc dù việc xử lý giống nhau sẽ tạo ra những cải tiến lớn về kết nối mỗi giây và tốc độ của các yêu cầu.


31
bạn có thể đã sửa lỗi này ViewState lớn pesky mà không MVC quá
Andrei Rînea

1
Chỉ cần để xây dựng ViewState có thể turnd off @ cấp độ trang hoặc trong web.config
bbqchickenrobot

8
có nhưng trong mvc, mặc định của nó không phải là một quyết định thiết kế buộc bạn phải rời khỏi tất cả các quyền kiểm soát và các nhà cung cấp tuyên bố chỉ hoạt động trên các biểu mẫu web, bằng cách làm cho biểu mẫu web "hoạt động sai" bằng cách loại bỏ xương sau của nó. Tôi không đồng ý rằng bạn chỉ có thể mã hóa lại trang đó, nhưng toàn bộ ứng dụng đã tốt hơn mà không có trạng thái xem.
phát triểnChris

thì bạn có nghĩ rằng đó là quyết định tồi tệ nhất của bạn khi chuyển toàn bộ ứng dụng sang MVC thay vì tắt chế độ xem trong web.config? và không, viewstate không phải là xương sống. chỉ khi bạn đã nghiên cứu, trạng thái xem có thể được lưu trong bộ nhớ cache cũng như các phiên.
Simple Fellow

29

Tôi nghĩ rằng nhiều người nghĩ rằng WebForms vốn đã chậm hoặc tốn nhiều tài nguyên đang đặt sai chỗ. 9 trong số 10 lần tôi được đưa vào để tối ưu hóa một ứng dụng biểu mẫu web, có quá nhiều chỗ mà tác giả ứng dụng hiểu sai mục đích của viewstate. Tôi không nói rằng viewstate là hoàn hảo hay bất cứ điều gì, nhưng việc lạm dụng nó là CÁCH quá dễ dàng và chính sự lạm dụng này đang khiến trường viewstate bị phình ra.

Bài viết này rất hữu ích trong việc giúp tôi hiểu được nhiều sự lạm dụng này. https://weblogs.asp.net/infinitiesloop/truly-und hieu-viewstate

Để so sánh hợp lệ giữa MVC và WebForms, chúng tôi cần đảm bảo rằng cả hai ứng dụng đang sử dụng đúng cấu trúc.


14

Thử nghiệm của tôi cho thấy yêu cầu / giây nhiều hơn từ 2 lần đến 7 lần trên MVC, nhưng điều đó phụ thuộc vào cách bạn xây dựng ứng dụng biểu mẫu web của mình. Chỉ với văn bản "hello world" trên đó, không có bất kỳ kiểm soát phía máy chủ nào, mvc nhanh hơn khoảng 30-50%.


12

Đối với tôi, cải tiến "hiệu suất" thực sự trong MVC là việc tăng bề mặt có thể kiểm tra của ứng dụng. Với WebForms, có rất nhiều ứng dụng khó kiểm tra. Với MVC, số lượng mã có thể kiểm tra về cơ bản tăng gấp đôi. Về cơ bản, tất cả những gì không dễ dàng kiểm tra được là mã tạo ra bố cục. Tất cả logic nghiệp vụ và logic truy cập dữ liệu của bạn - bao gồm logic điền dữ liệu thực tế được sử dụng trong chế độ xem - hiện có thể kiểm tra được. Mặc dù tôi mong đợi nó cũng hoạt động hiệu quả hơn - vòng đời của trang được đơn giản hóa rất nhiều và dễ sử dụng hơn để lập trình web - ngay cả khi nó giống nhau hoặc chậm hơn một chút thì cũng đáng để chuyển sang từ góc độ chất lượng.


Tôi thực sự muốn biết tại sao ai đó lại từ chối câu trả lời này.
tvanfosson

Cảm nhận của tôi là nó có thể bị phản đối vì một ứng dụng biểu mẫu web ASP.NET được thiết kế tốt cũng có thể kiểm tra được như một ứng dụng MVC. Kinh nghiệm của tôi với việc phát triển cả hai là MVC buộc bạn phải theo một mô hình lập trình sạch (đó là một trong những điểm mạnh nhất của nó, IMO). Biểu mẫu web cho phép bạn làm những việc lười biếng hơn, nhưng vẫn rất có thể có cùng một bề mặt có thể kiểm tra được trong biểu mẫu web. Đó là suy đoán của tôi, dù sao.
dudemonkey,

Chế độ xem dao cạo theo nghĩa đen khuyến khích việc nhúng mã bên trong chế độ xem. Điều đó không thể kiểm tra được và nó không phải là điềm báo tốt cho việc tách các mối quan tâm. Chỉ vì MVC khiến bạn viết bộ điều khiển, không có nghĩa là bạn không thể ghi lại tất cả nếu bạn không biết mình đang làm gì. Một nhà phát triển có kỹ năng sẽ nhận được nhiều hiệu suất từ ​​WebForms (hoặc hơn) so với MVC và sẽ có một "bề mặt có thể kiểm tra" gần như giống hệt nhau.
Richard Hauer

@RichardHauer điều đó thực sự không đúng khi tôi viết điều này nhưng họ đã cải thiện điều đó. Vì WebForms dường như không có tương lai trong .NET Core, nên nó có vẻ là một điểm tranh luận.
tvanfosson

@tvanfosson Đồng ý - bây giờ là cuộc tranh luận. Không chắc bạn nghĩ bit nào là không đúng, có lẽ bạn phản đối việc tôi sử dụng "theo nghĩa đen"? Dù sao đi nữa, các phiên bản MVC mới hơn với TagHelpers sẽ giúp tôi phá bỏ thói quen đặt mã vào các bố cục mà cuối cùng có thể khiến nó hoạt động với tôi. Tất nhiên, đánh giá cao bài đăng này khá cũ, nhưng ngay cả vào thời điểm đó, một dạng WebForms được xây dựng tốt vẫn rất nhanh mà không có "dây ma thuật" của MVC và không có mã nào được nhúng trong chế độ xem.
Richard Hauer

7

Tôi nghĩ vấn đề ở đây là dù ASP.Net MVC có nhanh hơn bao nhiêu so với các biểu mẫu web cũ đi chăng nữa thì nó cũng sẽ không tạo ra sự khác biệt, bởi vì phần lớn thời gian được thực hiện là trong cơ sở dữ liệu. Hầu hết thời gian, máy chủ web của bạn sẽ ở mức sử dụng CPU 0-10% chỉ chờ máy chủ cơ sở dữ liệu của bạn. Trừ khi bạn nhận được số lượng truy cập cực kỳ lớn trên trang web của mình và cơ sở dữ liệu của bạn cực kỳ nhanh, bạn có thể sẽ không nhận thấy sự khác biệt lớn.


Người dùng của bạn có thể - không có trạng thái xem.
UpTheCreek

6

Các con số cụ thể duy nhất mà tôi có thể tìm thấy từ sự phát triển ASP.NET MVC sơ khai là trên chuỗi diễn đàn này:

http://forums.asp.net/p/1231621/2224136.aspx

Bản thân Rob Connery đã phần nào xác nhận tuyên bố rằng ScottGu đã tuyên bố rằng ASP.NET MVC có thể phục vụ 8000 yêu cầu mỗi giây.

Có lẽ Jeff và nhóm của anh ấy có thể đưa ra một số gợi ý từ việc phát triển trang web này của họ.


3

Trái ngược với ý kiến ​​được chấp nhận, việc sử dụng biểu mẫu web được tối ưu hóa hoàn toàn giết chết MVC về hiệu suất thô. Các biểu mẫu web đã được siêu tối ưu hóa cho nhiệm vụ cung cấp html lâu hơn nhiều so với MVC.

Các chỉ số có sẵn trên http://www.techempower.com/benchmarks/#section=data-r7&hw=i7&test=db

Mỗi mvc so sánh đơn lẻ đều nằm ở thứ hạng dưới-giữa / dưới-trên của danh sách, trong khi việc sử dụng biểu mẫu web được tối ưu hoá nằm ở thứ hạng trên-giữa / trên-dưới.

Xác nhận sơ sài nhưng rất nghiêm túc đối với các chỉ số này, www.microsoft.com được cung cấp bởi các biểu mẫu web không phải MVC. Có ai ở đây tin rằng họ sẽ không chọn MVC nếu nó nhanh hơn theo kinh nghiệm không?


2

Thực sự không có cách nào để trả lời điều này. MVC sử dụng công cụ xem Biểu mẫu Web theo mặc định và có thể được định cấu hình để sử dụng bất kỳ số lượng công cụ xem tùy chỉnh nào, vì vậy nếu bạn muốn so sánh hiệu suất, bạn sẽ phải cụ thể hơn.


2

Tôi bắt đầu công việc trong MVC khoảng một năm trước, tôi có cảm hứng nhưng không ấn tượng.

Tôi ghê tởm trạng thái xem và xem nó là gốc rễ của mọi điều xấu xa về mặt ASP.NET. Đây là lý do tại sao tôi không sử dụng nó và thành thật mà nói, tại sao bạn lại muốn?

Về cơ bản, tôi đã lấy khái niệm ASP.NET MVC Framework và xây dựng nó theo cách của riêng tôi. Tôi đã thay đổi một vài thứ. Tôi đã tạo mã gói bộ điều khiển hoặc mã định tuyến URL xung quanh biên dịch lại động.

Bây giờ, tôi muốn nói rằng các ứng dụng ASP.NET MVC sẽ nhanh hơn dựa trên cách bạn sử dụng nó. Nếu bạn hoàn toàn từ bỏ WebForms, bạn sẽ nhanh hơn vì vòng đời của ASP.NET và mô hình đối tượng là rất lớn.

Khi bạn đang viết, bạn đang tạo ra một đội quân ... không chờ đợi, một quân đoàn các đối tượng sẽ tham gia vào việc hiển thị chế độ xem của bạn. Điều này sẽ chậm hơn nếu bạn thể hiện số lượng hành vi tối thiểu trong chính trang ASPX. (Tôi không quan tâm đến tính trừu tượng của công cụ chế độ xem vì hỗ trợ cho các trang ASPX trong Visual Studio là khá tốt, nhưng tôi đã hoàn toàn loại bỏ WebForms như một khái niệm và về cơ bản bất kỳ khung ASP.NET nào do mã bị phình hoặc không thể thay đổi những thứ liên quan đến ứng dụng của tôi).

Tôi đã tìm cách dựa vào biên dịch lại động (System.Reflection.Emit) để tạo ra các đối tượng và mã mục đích đặc biệt bất cứ khi nào cần. Việc thực thi mã này nhanh hơn phản chiếu nhưng ban đầu được xây dựng thông qua dịch vụ phản chiếu. Điều này đã mang lại cho khung công tác có hương vị MVC của tôi hiệu suất tuyệt vời nhưng cũng được nhập rất tĩnh. Tôi không sử dụng chuỗi và bộ sưu tập cặp tên / giá trị. Thay vào đó, các dịch vụ trình biên dịch tùy chỉnh của tôi sẽ viết lại một bài đăng biểu mẫu cho một hành động trình điều khiển được chuyển một kiểu tham chiếu. Đằng sau hậu trường có rất nhiều thứ đang diễn ra nhưng mã này nhanh, nhanh hơn rất nhiều so với WebForms hoặc MVC Framework.

Ngoài ra, tôi không viết URL, tôi viết các biểu thức lambda được dịch thành các URL mà sau này sẽ cho biết hành động điều khiển nào sẽ gọi. Điều này không đặc biệt nhanh nhưng nó đánh bại việc có các URL bị hỏng. Nó giống như nếu bạn có các tài nguyên được nhập tĩnh cũng như các đối tượng được nhập tĩnh. Một ứng dụng web được nhập tĩnh? Đó là thứ mà tôi muốn!

Tôi sẽ khuyến khích nhiều người thử điều này.


2
Vì vậy, đây không phải là một câu trả lời trực tiếp cho câu hỏi? Tuy nhiên, nó có liên quan và nó tạo ra một vài điểm tốt. Nhưng này, đó là thứ tôi xây dựng cho nhu cầu của riêng mình và nó hoàn toàn phù hợp với tôi. Tôi cũng thích chia sẻ ý tưởng của mình, ngay cả khi rất ít người hiểu tại sao.
John Leidegren

1
Chà, bạn không cần phải thay đổi phiếu bầu của mình, nhưng bạn không cần phải bỏ phiếu cho nó, bởi vì nó không phải là câu trả lời '. Nếu bạn dành một chút thời gian xem xét văn bản, có một số điều cho thấy ASP.NET MVC nhanh hơn WebForms và tại sao lại như vậy. Và nó tóm tắt những thứ như phản chiếu và mô hình đối tượng và chi phí ViewState của WebForms.
John Leidegren

@John - bây giờ MVC2 đã ra mắt với liên kết mô hình được cải thiện, xác thực, trình trợ giúp được đánh máy mạnh, v.v., bạn sẽ đánh giá nó như thế nào so với phương pháp của bạn?
tvanfosson

MVC2 tốt hơn rất nhiều, tôi tin rằng nó đã thay thế khá nhiều những gì tôi đang xây dựng vào thời điểm đó (với MVC1 trong bản beta). Tôi đã gặp khá nhiều thử thách của các vấn đề liên quan đến những gì tôi đang cố gắng xây dựng trên ASP.NET mà không chọn không sử dụng công cụ hiện có. Đủ để nói rằng, tôi đã học được rất nhiều và cuối cùng đã đưa điều này vào sản xuất. Bây giờ tôi nhận ra rằng công cụ / khuôn khổ hiện tại (VS / ASP.NET / C #) không thực sự phù hợp với công cụ này và cuối cùng nếu bạn muốn đi theo con đường này, bạn sẽ cần đầu tư vào trình biên dịch / kiểm tra mô hình của riêng mình để một số thứ hoạt động có lợi cho bạn.
John Leidegren

Tôi không nghĩ nhiều về ASP.NET MVC vào thời điểm đó. Nó thiếu những thứ tôi biết tôi muốn. Nhưng, tôi đã phải dành rất nhiều thời gian để phát triển, thử nghiệm và tìm ra những điều này. Tôi vẫn nghĩ rằng khía cạnh tĩnh của khung công tác web mà tôi đang xây dựng vượt trội hơn MVC về mặt đó nhưng trình biên dịch C # không hiệu quả để giải quyết vấn đề đó. Bạn cần một số ngôn ngữ / trình biên dịch cho phép linh hoạt hơn khi nói đến lập trình meta. Tôi đã phải làm rất nhiều việc đó trong thời gian chạy và thường không thể lưu vào bộ đệm các phiên bản đã biên dịch, vì vậy tôi phải biên dịch lại động rất nhiều thứ.
John Leidegren

2

Các dự án được tạo với studio trực quan. Một là mẫu mvc4, một là WebForm (điều kiện). Và khi thực hiện kiểm tra tải với WCAT, đây là kết quả,

MVC4 khá chậm so với WebForms, bất kỳ ý tưởng nào?

nhập mô tả hình ảnh ở đây

MVC4

  • có thể nhận được khoảng 11 rps
  • rps khá thấp cả máy chủ 2 cpu hoặc 4 cpu

nhập mô tả hình ảnh ở đây

WebForms (aspx)

  • có thể đạt trên 2500 rps

  • kẻ giết hiệu suất đã được tìm thấy rằng đó là một lỗi của MVC Bata hoặc RC. Và hiệu suất sẽ được cải thiện khi tôi loại bỏ các thứ trong Gói. Bây giờ phiên bản mới nhất đã sửa lỗi này.


1

Hiệu suất phụ thuộc vào những gì bạn đang làm ... Thông thường MVC nhanh hơn asp.net chủ yếu là do Viewstate không có và vì MVC hoạt động với Callback nhiều hơn là Postback theo mặc định.

Nếu bạn tối ưu hóa trang biểu mẫu web của mình, bạn có thể có hiệu suất tương tự như MVC nhưng sẽ tốn rất nhiều công sức.

Ngoài ra, chúng có rất nhiều mã cho MVC (và cả cho Biểu mẫu web) để giúp bạn cải thiện hiệu suất trang web như kết hợp và thu nhỏ css và javascrip, nhóm các hình ảnh của bạn và sử dụng chúng như một sprite, v.v.

Hiệu suất của trang web phụ thuộc rất nhiều vào kiến ​​trúc của bạn. Một mã sạch và tách biệt mối quan tâm tốt sẽ mang lại cho bạn mã sạch hơn và ý tưởng tốt hơn về cách cải thiện hiệu suất.

Bạn có thể xem qua mẫu này "Mẫu Neos-SDI MVC " sẽ tạo cho bạn một kiến ​​trúc sạch sẽ với nhiều cải tiến về hiệu suất theo mặc định (kiểm tra trang web MvcTemplate ).


-1

nhập mô tả hình ảnh ở đây

Tôi đã thực hiện một thử nghiệm kiểm tra tải VSTS nhỏ với một số mã cơ bản và nhận thấy thời gian phản hồi của ASP.NET MVC nhanh hơn gấp đôi so với ASP.NET Webforms. Trên đây là đồ thị kèm theo cốt truyện.

Bạn có thể đọc chi tiết thí nghiệm kiểm tra tải này từ bài viết CP này https://www.codeproject.com/Articles/864950/ASP-NET-MVC-vs-ASP-NET-WebForm-performance-compari

Thử nghiệm được tiến hành với các thông số kỹ thuật dưới đây bằng cách sử dụng VSTS và phần mềm kiểm tra tải telerik: -

Người dùng tải 25 người dùng.

Thời gian chạy thử nghiệm là 10 phút.

Máy cấu hình DELL 8 GB Ram, Core i3

Dự án được lưu trữ trong IIS 8.

Dự án được tạo bằng MVC 5.

Kết nối mạng LAN đã được giả định. Vì vậy, thử nghiệm này không tính đến độ trễ mạng.

Trình duyệt trong thử nghiệm đã chọn Chrome và Internet explorer.

Đọc nhiều lần trong quá trình kiểm tra để tính trung bình các sự kiện chưa biết. 7 bài đọc được thực hiện và tất cả các bài đọc được xuất bản trong bài báo này dưới dạng bài đọc 1, 2, v.v.


Phương pháp kiểm tra của bạn không tốt, và thiên lệch nhiều, và kết luận của bạn không hợp lệ. Một ứng dụng WebForms được xây dựng phù hợp có thể kiểm tra được, có sự phân tách các mối quan tâm thích hợp và có chi phí tải trọng tối thiểu. Mặc dù MVC không có vòng lặp sự kiện vòng đời trang, nhưng nó có định tuyến và thực thi chế độ xem để cạnh tranh. Các bài viết của bạn về chủ đề này trên CP có nhiều thành kiến.
Richard Hauer

Một ứng dụng được xây dựng đúng cách và cẩn thận ngay cả trong một công nghệ tồi tệ nhất sẽ hoạt động kỳ diệu. Vòng đời của trang ASP.NET chắc chắn có nhiều tải hơn so với thực thi định tuyến & chế độ xem vì nó liên quan đến việc tạo giao diện người dùng HTML. Định tuyến là một phần của khung ASP.NET nên ngay cả trong các biểu mẫu web bình thường, chúng vẫn tồn tại. Tôi đồng ý một điều là nếu bạn không viết mã thì hiệu suất của bạn sẽ tương đương với MVC Nhưng hộp công cụ của Webform quá hấp dẫn khiến mã phía sau trở thành một phần không thể thiếu của nó. Trong khi MVC hoàn toàn không cho phép tôi làm điều đó. Tôi thích cách họ đã vô hiệu hóa chế độ xem thiết kế và mã phía sau.
Shivprasad Koirala
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.