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.
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. –
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