2014-09-03 14 views
5

Tôi có ứng dụng MVC 5.x đã có giao diện được biên dịch trước và hợp nhất thành một hội đồng duy nhất. Ngay cả sau khi tất cả điều này yêu cầu đầu tiên cho một cái nhìn sau khi khởi động AppDomain là chậm, nó không quan trọng mà xem được yêu cầu vì họ là tất cả chậm lần đầu tiên xem được yêu cầu. Đào với MiniProfiler tôi có thể thấy nó là "Render" thời gian trên xem mà mất phần lớn thời gian và khi yêu cầu bổ sung để xem thời gian Render được giảm khoảng 90%. Vì vậy, để được rõ ràng nó là lần đầu tiên Render đó là dùng allot của thời gian. Tôi đã không mong đợi để thấy điều này chút chậm chạp do thực tế tất cả các quan điểm đã được biên dịch trước và tôi không tin rằng nó là JIT gây ra chậm lớn này ... bất cứ ai có bất kỳ đoán hoặc hiểu biết?Chế độ xem MVC đã biên dịch Vẫn hiển thị chậm theo yêu cầu đầu tiên

Xin lưu ý, đây không phải là yêu cầu đầu tiên của ứng dụng web, đây là yêu cầu đầu tiên của một chế độ xem/trang cụ thể. Ví dụ: đối với thử nghiệm bên dưới ứng dụng đã chạy hàng giờ và đã nhận yêu cầu liên tục nhưng thử nghiệm đã thu được yêu cầu đầu tiên cho chế độ xem này.

Yêu cầu đầu tiên

Capture of MiniProfiler

Second Yêu cầu

enter image description here

+0

trùng lặp có thể có của [thời gian khởi động MVC ASP.Net revisited] (http://stackoverflow.com/questions/13794580/mvc-asp -net-startup-time-revisited) –

+0

Than ôi, tôi không biết nếu điều này có bất kỳ câu trả lời nào. Lần đầu tiên ứng dụng web ASP.NET MVC khởi động, thường mất khoảng 5 giây. Việc biên dịch trước các khung nhìn dường như không có bất kỳ ảnh hưởng nào. Tôi chưa bao giờ thấy một câu trả lời thực sự cho điều này bởi Microsoft. –

+1

@RowanFreeman Đây không phải là yêu cầu đầu tiên của ứng dụng AppDomain/web mà là yêu cầu đầu tiên của một chế độ xem/trang cụ thể. Tôi đã làm điều này rõ ràng hơn trong câu hỏi. –

Trả lời

0

Strange! Để chắc chắn 100% chính xác những gì sẽ xảy ra, tuy nhiên, tôi muốn làm như sau:

  1. tôi sẽ chuyển hướng biên soạn thời gian chạy (có, sẽ có một kể từ nhất toàn cầu. tuyến Asax cần phải được biên dịch) như thế này:

    <system.web> 
        <compilation debug="true" targetFramework="4.5" tempDirectory="c:\temp\asp.net" /> 
        ... 
    </system.web> 
    
  2. tôi sẽ điều tra các nội dung của thư mục trước và sau khi chạy đầu tiên . Có lẽ sẽ tốt hơn nếu có bản sao của bản gốc.

Từ mô tả của bạn về vấn đề, có vẻ như mọi thứ sẽ ổn và sẽ không có sự khác biệt giữa các lần chạy. Vẫn so sánh nội dung của thư mục trước và sau có thể tiết lộ một số khác biệt.

Một nguyên nhân khác có thể là một số bộ nhớ đệm nhưng tôi có thể đoán bạn đã sắp xếp việc này.

+0

Không nên có biên dịch thời gian chạy ở đây - ứng dụng MVC của chúng tôi được biên dịch trước và không thể cập nhật được và kết quả là không có global.asax vì nó được biên dịch. Tuy nhiên tôi sẽ cung cấp cho thử nghiệm của bạn một thử và hãy xem. Các dòng khác của điều tra là để xem nếu các tùy chọn biên dịch khác nhau (Debug vs phát hành vs PDB, vv) đóng một vai trò ở đây. –

+0

Hãy nhớ lại vấn đề này là gì: lần chạy đầu tiên chậm hơn nhiều so với bất kỳ vấn đề nào sau đây, đúng không? Nếu vậy, lý do là hoặc trong một số chuẩn bị trước khi chạy đầu tiên, đó là biên dịch, hoặc chuẩn bị cho nhanh hơn, thứ ba, vv chạy, nói caching. Tôi sẽ không mong đợi rằng loại xây dựng, gỡ lỗi hoặc phát hành, sẽ ảnh hưởng đến điều này. –

+0

Và cũng có thể, bạn có thể muốn chú ý đến biên dịch JIT mã IL. Mặc dù rất nhanh, nó xảy ra ít nhất một lần, đó là trước khi một đoạn mã được gọi lần đầu tiên. Tuy nhiên, một sự khác biệt lớn như vậy, và trong giai đoạn render là (mặc dù nó là "render thuần túy", hoặc render + cái gì khác) là không chắc chắn là nguyên nhân. –

0

Tôi đã gặp khó khăn với cùng một vấn đề chính xác trong nhiều tháng: Chỉ xảy ra với tôi ở một số chế độ xem. Rõ ràng, việc render các khung nhìn không đơn giản như tôi nghĩ, vì MVC cần chạy một vài hoạt động để xác định chính xác .cshtml để sử dụng cho một hành động, các khung nhìn một phần của nó nếu bạn có bất kỳ, v.v ... .

gì đã làm các công việc đối với tôi là sử dụng Razor Generatorquá trình Razor file lúc thiết kế thay vì thời gian chạy. (Nếu bạn muốn cho nó một shot, tôi đề nghị đầu tiên thử nó với một cái nhìn bạn biết cần có thời gian để tải lúc đầu tiên cố gắng).

Từ trang web:

Một lý do để làm điều này là để tránh bất kỳ hit thời gian chạy khi bạn trang web bắt đầu, vì không còn gì để biên dịch tại thời gian chạy.Điều này có thể là quan trọng trong các trang web có nhiều lượt xem.

Nhược điểm của việc thực hiện Razor Generator là bạn không còn cần các tập tin .cshtml: vì vậy nếu bạn muốn thay đổi một cái nhìn, bạn cần phải biên dịch lại dự án. Nhưng đó không phải là vấn đề nhất thiết, ít nhất là không phải cho tôi.

Cài đặt Trình tạo dao cạo từ bộ sưu tập tiện ích mở rộng VS trước tiên (như được giải thích trên trang web) và sau đó là gói nuget.

tin tưởng tôi: bạn đang gonna được rất nhẹ nhõm bạn đang gonna khóc ☺

+0

Vì vậy, những gì hiện Razor Generator làm việc xây dựng trong trình biên dịch xem aspnet và sáp nhập không làm để thực hiện công việc này? Bạn đã cố gắng sử dụng các công cụ phức tạp trong thời gian thiết kế được xây dựng chưa? –

+0

RazorGenerator cho phép xử lý các tệp Razor tại thời gian thiết kế thay vì thời gian chạy, cho phép chúng được xây dựng thành một assembly để tái sử dụng và phân phối đơn giản hơn. Có một sự nhầm lẫn về "biên dịch": khi bạn đặt ' true', bạn thực sự yêu cầu trình biên dịch kiểm tra lỗi trong chế độ xem: sự khác biệt là RazorGenerator bao gồm một lớp .cs trên mỗi mỗi khung nhìn (hoặc chỉ các khung nhìn bạn muốn) như là một phần của assembly được biên dịch: về cơ bản bạn đang lưu công việc của MVC để giải thích từng khung nhìn lần đầu tiên. Bạn đang đề cập đến công cụ biên dịch nào? – Silvestre

+0

Chúng tôi đang xây dựng các chế độ xem qua hồ sơ xuất bản được thiết lập để xây dựng tất cả các chế độ xem thành một hội đồng trong chế độ phát hành. Các tệp xem được triển khai nhưng chỉ là các tệp đánh dấu được tạo bởi công cụ tiền xử lý trước. Một assembly đơn mà chúng tôi đặt tên là Web.Site.Pages.dll có kích thước 5MB và sử dụng Reflector, bạn có thể thấy tất cả các lớp xem được biên dịch trong không gian tên ASP.Hội đồng này được đặt trong thư mục bin cùng với tệp * .compiled cho mỗi chế độ xem. Điều đó nói rằng, RazorGenerator khác nhau ở đây như thế nào? –

Các vấn đề liên quan