5

Tôi đang cố khắc phục một số vấn đề về thời gian khởi động. Sau khi làm một số hồ sơ, tôi đã tìm thấy thủ phạm chính là ClassProxyGenerator.GenerateCode. Điều này mất 400-600ms mỗi loại lần đầu tiên. Vì vậy, nếu điểm vào ứng dụng có 8 phụ thuộc (trong một chuỗi) cần proxy được tạo, thời gian khởi động của ứng dụng sẽ tăng 4,8 giây. Điều này có vẻ không nhiều, nhưng đối với người dùng, nó có vẻ giống như lứa tuổi.DynamicProxy Generation Speed ​​

Bất kỳ lời khuyên nào để cải thiện điều này?

Cập nhật:

tôi có thể mô phỏng thời gian với các ứng dụng giao diện điều khiển sau:

 var container = new WindsorContainer(); 
     container.Register(Component.For<Interceptor>()); // dummy IInterceptor...does nothing 
     container.Register(Component.For<IMyRepository, MyAbstractRepository>().Interceptors<Interceptor>()); 
     var t = DateTime.Now; 
     var instance = container.Resolve<IMyRepository>(); 
     Debug.WriteLine("Resolved in " + (DateTime.Now - t).TotalMilliseconds); 

đầu ra ở đâu đó giữa 550ms và 750ms.

IMyRepository là giao diện kho lưu trữ cho 30 loại thực thể (được tạo bởi mẫu T4). Nó có 31 IQueryables, 31 Lưu quá tải và 31 Xóa quá tải. MyAbstractRepository là một lớp trừu tượng một phần. Nó khai báo cùng phương thức 3 x 31.

Nếu tôi loại bỏ tất cả các lưu và xóa các phương pháp và để lại chỉ là 31 IQueryables VÀ không đăng ký kho trừu tượng

container.Register(Component.For<IMyRepository>().Interceptors<Interceptor>()); 

tôi vẫn chạy xung quanh 250ms cho thế hệ ban đầu.

Đây là một máy rất nhanh (rất rất) ... vì vậy, mọi thứ trong thế giới thực sẽ có khả năng hoạt động chậm hơn so với các số được liệt kê ở trên.

+1

Điều đó thật lố bịch - trừ khi các loại của bạn có hàng trăm/nghìn phương pháp (hoặc bạn đang chạy mã trên máy 20 yo) không phải như vậy. Bạn có thể tạo ra sự sinh sản cô lập? –

+0

Tôi biết ... và nó không phải là một máy 20 năm ... Nó có vẻ là một bộ cụ thể của các loại có holdup này (những người khác tạo ra trong 5-10ms) ... Tôi sẽ cô lập và cung cấp một mẫu mã. – Jeff

+1

Nếu bạn có các phụ thuộc nơi sử dụng có thể được trì hoãn, bạn có thể ẩn phần đó của biểu đồ phụ thuộc phía sau proxy ảo. Xem ở đây để biết tổng quan về khái niệm: http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –

Trả lời

1

Bạn có thể thực hiện khởi tạo proxy trong một luồng khác, để bản thân ứng dụng có thể tiếp tục khởi tạo trong khi proxy được tạo. Xem xét xếp hàng này vào trong luồng.

Một tùy chọn khác có thể là biên dịch proxy thành tệp lắp ráp liên tục, sau đó được lưu vào đĩa. Làm như vậy sẽ làm giảm đáng kể thời gian khởi động sau lần chạy đầu tiên.

Tôi không chắc tại sao proxy động của Castle mất quá nhiều thời gian để khởi tạo. Tôi không sử dụng chúng, tôi thường phát ra mã trực tiếp (hoặc là LCG cho các phương thức đơn giản, và thông qua Reflection.Emit đầy đủ để thực hiện đầy đủ). Tôi không bao giờ có sự chậm trễ như vậy, ngay cả khi tạo ra hàng trăm phương pháp LCG. Có thể sử dụng một cách tiếp cận/thư viện khác (LinFu, vv) cũng có thể khắc phục vấn đề.

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