2008-11-14 29 views
20

Trong quá trình xây dựng, chúng tôi chạy aspnet_compiler.exe để chống lại các trang web của chúng tôi để đảm bảo rằng tất cả các công cụ bị ràng buộc trong ASP.NET/MVC thực sự được xây dựng (tôi không biết gì về ASP.NET nhưng chắc chắn điều này là cần thiết để ngăn chặn việc tìm kiếm lỗi thời gian chạy).Tại sao aspnet_compiler.exe quá chậm (và nó có thể được thực hiện nhanh hơn)?

Các trang web của chúng tôi có kích thước khá lớn, với vài trăm trang/lượt xem/điều khiển/v.v. tuy nhiên thời gian thực hiện có vẻ quá nhiều trong khoảng 10-15 phút (để tham khảo, điều này dài hơn cả giải pháp với khoảng 40 dự án để biên dịch, và chúng tôi chỉ biên soạn trước hai dự án trang web).

Tôi nghi ngờ rằng phần cứng là vấn đề khi tôi chạy trên chip Intel lõi tứ mới nhất, RAM 4GB và ổ cứng WD Velociraptor 10.000rpm. Và một phần của những gì là kỳ lạ là EXE dường như không được sử dụng nhiều CPU (1-5%) và dường như không được làm rất nhiều khủng khiếp của I/O hoặc.

Vì vậy, ... đây có phải là sự cố đã biết không? Tại sao nó quá chậm? Và có cách nào để tăng tốc nó không?

Lưu ý: Để làm rõ một vài điều mọi người đã trả lời, tôi không nói về việc biên dịch mã trong Visual Studio. Chúng tôi đang sử dụng các dự án ứng dụng web rồi, và tốc độ biên dịch những dự án đó không phải là vấn đề. Vấn đề là việc biên dịch trước trang web sau các dự án này đã được biên soạn (see this MSDN page for more details) như một phần của tập lệnh xây dựng nhà phát triển. Chúng tôi đang thực hiện biên dịch trước tại chỗ, không sao chép các tệp vào thư mục đích.

+11

Bạn có thể lấy aspnet_compiler để biên dịch trang web nhanh hơn không? Câu trả lời bạn chấp nhận không hữu ích lắm vì nó nói để sử dụng một dự án ứng dụng web, mà bạn đã làm – JeremyWeir

Trả lời

2
  1. trình biên dịch sẽ tạo ra thứ hai code-behind file cho mỗi trang .aspx, check
  2. Trong biên soạn, aspnet_compiler.exe sẽ sao chép tất cả các tập tin trang web vào thư mục đầu ra, bao gồm css, js và hình ảnh.

Bạn sẽ nhận được thời gian biên dịch tốt hơn bằng cách sử dụng Web application project thay vì mô hình trang web.

+2

Bây giờ thì giờ biên dịch trước của bạn với giải pháp này là gì? –

0

Tôi không có bất kỳ lời khuyên cụ thể nào cho trình biên dịch này, nhưng khi tôi có loại vấn đề này, tôi chạy ProcMon để xem quy trình đang làm gì trên máy và tôi chạy Wireshark để kiểm tra xem nó có phải là 'không' t chi tiêu lứa tuổi thời gian ra một số truy cập mạng vào một máy bị lãng quên dài được tham chiếu trong một số khóa registry hoặc biến môi trường.

4

Đơn giản, aspnet_compiler sử dụng hiệu quả "khóa trình biên dịch toàn cầu" bất cứ khi nào nó bắt đầu biên dịch trước bất kỳ trang aspx cá nhân nào; về cơ bản, nó chỉ được phép biên dịch từng trang liên tục. Có một số lý do cho việc này (mặc dù cá nhân tôi không đồng ý với họ) - chủ yếu là để phát hiện và ngăn chặn các tham chiếu vòng tròn gây ra một vòng lặp vô hạn, cũng như đảm bảo rằng tất cả các phụ thuộc được xây dựng đúng cách trước khi trang yêu cầu biên soạn, họ tránh được rất nhiều "vấn đề CS khó chịu".

Tôi đã bắt đầu viết một phiên bản ồ ạt của aspnet_compiler.exe lần cuối cùng tôi làm việc tại một công ty web, nhưng bị ràng buộc với "công việc thực sự" và chưa bao giờ hoàn thành nó. Vấn đề lớn nhất là các trang ASPX: các công cụ MVC/Razor bạn có thể song song HELL, nhưng công cụ biên dịch/phân tích ASPX là khoảng 20 cấp độ sâu của các lớp/phương thức nội bộ và riêng tư.

7

Chuyển sang trình biên dịch Roslyn nhiều khả năng sẽ cải thiện đáng kể thời gian biên dịch trước. Đây là một bài viết hay về nó: http://blogs.msdn.com/b/webdev/archive/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications.aspx.

Ngoài ra, hãy đảm bảo rằng việc biên dịch hàng loạt được bật bằng cách đặt thuộc tính lô thành true trên phần tử biên dịch.

+1

Vâng, điều này thật tuyệt. Chúng tôi chỉ đơn giản cài đặt gói Microsoft.CodeDom.Providers.DotNetCompilerPlatform' vào dự án của chúng tôi và có trình biên dịch lượt xem nhanh hơn gấp hai lần. –

+0

@MariuszPawelski Tôi đã cài đặt nhưng bước MVCBuildViews này vẫn sử dụng aspnet_compiler.exe vì một số lý do. Có cách nào để buộc trình biên dịch sử dụng Roslyn để xem trước biên dịch không? Core Compile và các bước khác sử dụng csc.exe là trình biên dịch Roslyn mới. – delloPiro

+0

@delloPiro Gói 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform' là _a drop-in thay thế cho các nhà cung cấp trong hộp và cài đặt gói là tất cả những gì bạn cần phải làm để kích hoạt chúng_ và aspnet_compiler.exe là _ chỉ đơn giản là trình bao bọc xung quanh tính năng biên dịch thời gian chạy và không sử dụng msbuild theo bất kỳ cách nào. Nó sẽ chỉ biên dịch các phần của ứng dụng của bạn đã được biên dịch tại thời gian chạy bởi ASP.NET_ Vì vậy, nếu bạn sử dụng MVCBuildViews nó vẫn sẽ sử dụng aspnet_compiler.exe. Nó chỉ sử dụng roslyn nội bộ để nó nhanh hơn. –

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