Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Windows

Giảm hiệu năng System.Diagnostics.StackFrame trong Windows 10

Nếu sau khi bạn nâng cấp lên Windows 10 hoặc .NET Framework 4.7.1, và bạn nhận thấy sự giảm hiệu năng đáng kể khi chạy ứng dụng .NET Framework sử dụng lớp System.Diagnostics.StackFrame, thì bài viết này có thể thú vị cho bạn. Chúng ta sẽ xem nguyên nhân, sau đó đưa ra các bản sửa lỗi đã biết.

Giảm hiệu năng System.Diagnostics.StackFrame

Giảm hiệu năng System.Diagnostics.StackFrame trong Windows 10

Một ứng dụng có hiệu năng chấp nhận được chạy trên .NET Framework 4.7 hoặc phiên bản trước chạy chậm hơn khi chạy trên .NET Framework 4.7.1. Các ứng dụng thường dựa vào StackFrame khi ném ngoại lệ (throw exceptions) .NET. Nếu điều này xảy ra ở tỷ lệ cao (hơn 10 sự kiện mỗi giây), ứng dụng có thể chậm đi đáng kể (gấp mười lần) và chạy chậm hơn rõ rệt so với trước.

Nguyên nhân giảm hiệu năng System.Diagnostics.StackFrame

.NET Framework 4.7.1 trong Windows 10 thêm hỗ trợ phát hiện và phân tích định dạng file PDB di động (Portable PDB) để hiển thị thông tin tệp và số dòng trong dấu vết ngăn xếp (stack traces). Là một phần của thay đổi này, mỗi hàm trong dấu vết ngăn xếp có mô-đun xác định của nó được kiểm tra để xác định xem mô-đun đó có sử dụng định dạng Portable PDB hay không. Do một số khác biệt trong chính sách bộ nhớ đệm nội bộ (internal caching policy), runtime dành nhiều thời gian hơn để tìm kiếm Portable PDBs so với các phiên bản .NET Framework trước đó dành cho việc tìm kiếm PDB Windows cổ điển (classic Windows PDBs).

Điều này khiến dấu vết ngăn xếp được định dạng (formatted stack traces) tạo ra chậm hơn trước.

Vấn đề này không thay đổi số lượng ngoại lệ được ném. Tuy nhiên, nó làm giảm đáng kể khả năng của ứng dụng xử lý các ngoại lệ đó.

Các ứng dụng sử dụng thư viện IKVM bị ảnh hưởng bởi vấn đề này nếu chúng dò tìm assembly (probing for assemblies). Việc dò tìm assembly được biết là gây ra ngoại lệ.

Khắc phục vấn đề giảm hiệu năng System.Diagnostics.StackFrame

Để khắc phục vấn đề này, Microsoft khuyến nghị sử dụng một trong các phương pháp sau.

1] Sử dụng constructor khác cho StackFrame nhận đối số Boolean

Đây là giải pháp ưu tiên.

Nếu nhà phát triển ứng dụng có thể thay đổi ứng dụng của họ, hãy gọi constructor System.Diagnostics.StackTrace.#ctor(Boolean) bằng cách sử dụng đối số false để tránh thu thập thông tin nguồn (source information). Điều này tránh phần mã mà hiệu năng bị giảm.

2] Quay lại phiên bản trước hoặc nâng cấp lên phiên bản Windows 10 mới nhất

Trong phương pháp này, quay lại phiên bản/build trước đó hoặc nâng cấp lên phiên bản/build Windows 10 mới nhất nếu bạn gặp vấn đề này và bạn hiện không chạy phiên bản Windows 10 mới nhất. Cũng gỡ cài đặt .NET Framework 4.7.1 nếu có, từ máy tính của bạn và sau đó tải xuống và cài đặt phiên bản trước hoặc phiên bản mới nhất của .NET Framework.

Hy vọng điều này giúp ích!

Giảm hiệu năng System.Diagnostics.StackFrame trong Windows 10