2012-06-27 30 views
5

Theo Brad Wilson, RenderAction chậm hơn so với RenderPartial.RenderAction và RenderPartial hiệu suất

Tuy nhiên, có ai có bất kỳ thống kê nào cho thấy sự khác biệt về hiệu suất không?

Tôi đang trong quá trình phát triển một ứng dụng trong đó các trang bao gồm "Tiện ích con".

Tôi có hai lựa chọn:

sáng tác tại Xem Cấp

Gọi RenderAction cho mỗi widget. Đây là cách tiếp cận dễ dàng nhất nhưng có nghĩa là chúng tôi đang thực hiện một chu kỳ MVC đầy đủ cho từng tiện ích.

sáng tác tại Controller Cấp

Soạn một ViewModel cho trang có chứa dữ liệu chúng ta cần cho mỗi widget. Gọi RenderPartial cho từng widget. Điều này phức tạp hơn nhiều để thực hiện nhưng có nghĩa là chúng tôi sẽ chỉ thực hiện một chu kỳ MVC.

Tôi đã thử nghiệm các phương pháp trên với 3 tiện ích con khác nhau trên trang và sự khác biệt về thời gian hiển thị là 10 giây trong một giây (hầu như không đáng lo ngại).

Tuy nhiên, có ai có kết quả thử nghiệm cụ thể hơn điều này hay có thể là trải nghiệm khi thử cả hai cách tiếp cận?

Trả lời

3

tôi muốn đề nghị 2 lựa chọn hơn, cả hai yêu cầu để tạo nên mô hình điểm ở cấp điều khiển và cả hai có thể làm việc cùng nhau (tùy thuộc vào dữ liệu)

  1. Html.DisplayFor() - hiển thị các mẫu
  2. Người trợ giúp thông qua các phương thức mở rộng

Tùy chọn 2 hoạt động rất tốt nếu bạn muốn giữ các tiện ích đó trong các hội đồng khác nhau, sau khi tất cả chỉ là các hàm trả về chuỗi. Tôi nghĩ rằng nó cũng có hiệu suất tốt nhất, nhưng tất nhiên bạn mất các mẫu 'thân thiện với thiết kế'. Tôi nghĩ rằng điều quan trọng là phải xem xét khía cạnh bảo trì, không chỉ hiệu suất thô (cho đến khi bạn thực sự cần nó, và thậm chí sau đó, bộ nhớ đệm là hữu ích hơn).

Đối với những thứ nhỏ (ngày hoặc tên định dạng, vv) tôi muốn sử dụng người trợ giúp, vì html thường là một khoảng với một lớp, cho công cụ phức tạp hơn tôi muốn sử dụng các mẫu hiển thị.

+0

+1 cho đề xuất DisplayFor(). Tôi hiện đang ủy thác trách nhiệm hiển thị cho tiện ích con vì vậy tôi chỉ cần gọi '@ widget.Render (Html)' và tiện ích con có thể sử dụng 'HtmlHelper' để hiển thị chính nó. Điều đó nói rằng, tôi có thể làm cho phái đoàn này tùy chọn và chỉ cần gọi 'DisplayFor()' theo mặc định. –

3

Gần đây tôi đã làm việc trên một ứng dụng gặp sự cố về hiệu suất và đã tìm thấy chế độ xem đang thực hiện bốn cuộc gọi tới RenderAction, cộng với một lệnh gọi khác trong bố cục. Tôi thấy rằng mỗi cuộc gọi đến RenderAction - ngay cả khi tôi thêm vào một hành động giả mà trả lại một cái nhìn trống - mất khoảng 200-300ms (trên máy địa phương của tôi). Nhân với số lượng cuộc gọi và bạn có một hit hiệu suất rất lớn trên trang. Trong trường hợp của tôi có bốn cuộc gọi gây ra khoảng một giây chi phí phía máy chủ không cần thiết. Bằng cách so sánh, các cuộc gọi đến RenderPartial là khoảng 0-10ms.

Tôi sẽ tránh sử dụng RenderAction ở bất kỳ nơi nào có thể có lợi cho RenderPartial. Bộ điều khiển phải chịu trách nhiệm trả lại tất cả thông tin cần thiết. Trong trường hợp widget, nếu bạn cần nhiều hành động cho một số widget, tôi sẽ cố gắng soạn chúng thành một hành động để RenderAction overhead chỉ xảy ra một lần, mặc dù nếu trang web của bạn hoạt động đầy đủ, tôi sẽ giữ chúng riêng biệt cho một thiết kế sạch hơn.

Chỉnh sửa: Tôi đã thu thập thông tin này bằng cách sử dụng MiniProfiler và nhấn vào trang web. Nó không phải là siêu chính xác nhưng nó rõ ràng cho thấy sự khác biệt.

Chỉnh sửa: Như Oskar đã chỉ ra bên dưới, ứng dụng được đề cập có thể có một số mã chuyên sâu chạy cho mỗi yêu cầu trong global.asax. Độ lớn của lần truy cập này sẽ phụ thuộc vào mã ứng dụng, nhưng RenderPartial sẽ tránh thực hiện một chu kỳ MVC khác.

+2

Tôi nghi ngờ rằng RenderAction() luôn là 200ms + - nếu RenderAction() luôn là 200ms thì yêu cầu trình duyệt cho cùng một hành động "xem trống" cũng phải có ít nhất 200ms. Nhưng vì yêu cầu trình duyệt nói chung có thể nhanh tới 10-20ms nên dường như ứng dụng được đề cập có một số mã nặng (ví dụ: global.asax) chạy cho mỗi yêu cầu. –

+0

@ Oskar điều này là đúng. Tôi đã không làm việc đó kể từ đó, nhưng tôi biết nó có một số vấn đề khá nghiêm trọng. Điều này chỉ đơn thuần là để minh họa rằng chu trình MVC ngầm được gọi trong 'RenderAction()' có thể có một sự khác biệt lớn về hiệu năng mặc dù xuất hiện rất giống với 'RenderPartial()'. – mao47