2009-04-21 37 views
5

Tôi đang gặp phải một điều kỳ lạ nhất trong vài ngày qua. Tôi phát hiện ra rằng bản phát hành Bản phát hành của tôi thực sự thực thi chậm hơn so với phiên bản Gỡ lỗi..Phát hành Bản phát hành Net hoạt động chậm hơn Gỡ lỗi

1. Vấn đề

cuối cùng tôi đã bị tước tất cả các công cụ từ điểm nhập cảnh của tôi (Main) trong Windows Forms của tôi exe, chỉ để lại này:

[STAThread] 
static void Main(params string[] args) 
{ 
    Stopwatch sw = Stopwatch.StartNew(); 
    System.Xml.Serialization.XmlSerializer xmlS = 
     new System.Xml.Serialization.XmlSerializer(typeof(TestClass)); 
    sw.Stop(); 
    MessageBox.Show(sw.Elapsed.ToString()); 
} 

Vì vậy, tôi thực sự không instantiating bất kỳ Biểu mẫu nữa, chỉ thử nghiệm. TestClass là một lớp học nhỏ với chỉ ba tài sản công khai int và không có gì khác. Myexe chính của tôi (Windows Forms) là ~ 1Mb lớn, nếu điều đó làm cho bất kỳ sự khác biệt.

2. Kết quả

Trong chế độ Debug, Thời gian đã qua của tôi là ~ 200ms, trong khi trong phiên bản phải mất ~ 1.2s.

3. Bổ sung thông tin

Điều kỳ lạ là khi tôi cố gắng thiết lập một số dự án khác ở chỗ giải pháp như dự án Startup, bởi vì trong trường hợp đó nó hoạt động nhanh (chính xác mã tương tự như trên).

4. Hack Nhanh

Để khắc phục lỗi này càng nhanh càng tốt, tôi đã tạo ra một dự án Startup .exe mới trong giải pháp của tôi, mà instantiates và chạy Application Form chính bằng cách tham khảo dự án nhập đầu tiên của tôi. Trong trường hợp đó nó hoạt động nhanh trở lại, mục nhập exe của tôi bây giờ chỉ lớn 24kb, chỉ chứa một phương thức tĩnh tĩnh.

Có ai đã từng gặp phải hành vi tương tự trước đây không? Nếu tôi đã tình cờ gặp điều này ở đâu đó, bằng cách nhìn vào đoạn mã trên, tôi có thể đoán rằng có một bộ khởi tạo tĩnh ở đâu đó, làm việc trong một chủ đề riêng biệt (nhưng không phải như vậy, tôi không có công cụ) và hơn thế nữa chỉ chạy trong bản dựng?

[Chỉnh sửa] Thông tin thêm: Tôi biết XmlSerializer tạo mã IL trong thời gian chạy, nhưng câu hỏi thực tế của tôi là tại sao nó hoạt động chậm hơn trong trường hợp này so với các trường hợp khác. Khi tôi điểm chuẩn chỉ serialization thực tế, nó là 3x chậm hơn trong Release (nhưng chỉ khi tôi chạy nó từ dự án ban đầu của tôi).

[Cập nhật] Bây giờ cho phần kỳ lạ nhất: Sau một vài bước sửa đổi/xây dựng lại, dự án mục nhập mới của tôi bắt đầu hoạt động như bước đầu tiên - khởi động chậm, tải chậm. Tôi đã thay đổi tên dự án và GUID và xây dựng lại nó và nó hoạt động nhanh trở lại.

+0

Hãy xem xét rằng XmlSerializer tạo ra một lớp học trong thời gian chạy để xử lý tuần tự thực tế. Nó tạo mã C# và biên dịch nó khi chạy. –

+0

Tôi hiểu điều đó, nhưng tôi không hiểu tại sao ứng dụng exe Release của tôi luôn chậm hơn.Hơn nữa, tôi có thể nhanh chóng XmlSerializer, ngủ cho 10 ví dụ, và sau đó làm serialization thực tế 1000 bộ đếm thời gian để chuẩn - và nó luôn luôn chậm hơn trong Release. – Groo

Trả lời

6

Tôi nghĩ có thể điều này là do XmlSerializer thực hiện NGEN-ish khi khởi động ở chế độ Release, nhưng không ở chế độ Debug. Xem ví dụ

http://blogs.msdn.com/billwert/archive/2008/02/23/use-of-sgen-exe-to-avoid-common-xmlserializer-performance-pitfalls.aspx

để biết thêm chi tiết.

+0

Cảm ơn, tôi thực sự sử dụng SGEN để tạo ra các hội đồng tuần tự hóa trong chế độ Release, nhưng nó vẫn chậm hơn. Nó thậm chí còn chậm hơn khi tôi tạo một serializer đầu tiên và sau đó chuẩn chỉ serialization chính nó. (nhân tiện, liên kết của bạn hiển thị điều này trong mozilla: "trang web tại www.topxml.com đã được báo cáo là trang web tấn công") – Groo

+0

Có, nhận được cảnh báo tương tự. Google cũng cảnh báo về trang web này: http://www.google.de/search?hl=de&q=site%3Awww.topxml.com –

+0

Cảm ơn, tôi đã sửa url thành blog msdn gốc. – Brian

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