عملکرد System.Diagnostics.StackFrame در ویندوز 10 کاهش می یابد

اگر پس از ارتقاء به Windows 10 یا .NET Framework 4.7.1 ، و هنگام اجرای برنامه های NET Framework که از کلاس System.Diagnostics.StackFrame استفاده می کنند، کاهش قابل توجهی در عملکرد مشاهده کردید ، ممکن است این پست برای شما جالب باشد. ما علت را بررسی می کنیم و سپس راه حل های شناخته شده ای برای خطا ارائه می دهیم.

عملکرد System.Diagnostics.StackFrame کاهش می یابد

عملکرد System.Diagnostics.StackFrame کاهش می یابد

برنامه‌ای که عملکرد قابل قبولی داشت که روی دات‌نت فریم‌ورک 4.7 یا نسخه‌های قبلی اجرا می‌شد، هنگام اجرا بر روی (.NET Framework 4.7)دات‌نت فریم‌ورک 4.7.1(.NET Framework 4.7.1) کندتر اجرا می‌شود . برنامه‌ها معمولاً زمانی که استثناهای دات‌نت را پرتاب می‌کنند به StackFrame متکی هستند. اگر این با سرعت بالا (بیش از 10 حادثه در ثانیه) اتفاق بیفتد، برنامه ها می توانند به طور قابل توجهی (ده برابر) کندتر شوند و به طور قابل توجهی کندتر از قبل اجرا شوند.

علت کاهش عملکرد System.Diagnostics.StackFrame(Cause of the System.Diagnostics.StackFrame performance degrade)

NET Framework 4.7.1 در ویندوز 10(Windows 10) پشتیبانی از شناسایی و تجزیه فرمت فایل PDB قابل حمل را برای نمایش اطلاعات فایل و شماره خط در ردیابی پشته اضافه کرد. به عنوان بخشی از این تغییر، هر تابع در یک ردیابی پشته ماژول تعیین کننده خود را بررسی می کند تا مشخص شود آیا آن ماژول از قالب PDB قابل حمل استفاده می کند یا خیر . با توجه(Due) به برخی تفاوت‌ها در سیاست کش داخلی، زمان اجرا زمان بسیار بیشتری را صرف جستجوی PDB‌های قابل حمل(Portable PDBs) نسبت به نسخه‌های قبلی .NET Framework می‌کند که صرف جستجوی PDB‌های کلاسیک ویندوز می‌شود(Windows PDBs) .

این باعث می شود ردیابی پشته قالب بندی شده کندتر از قبل تولید شود.

این موضوع تعداد استثناهایی که پرتاب می شوند را تغییر نمی دهد. با این حال، به طور قابل توجهی توانایی برنامه ها را برای رسیدگی به آن استثناها کاهش می دهد.

برنامه‌هایی که از کتابخانه IKVM استفاده می‌کنند، اگر مجموعه‌ها را بررسی کنند، تحت تأثیر این مشکل قرار می‌گیرند. کاوش برای مجموعه ها باعث ایجاد استثنا می شود.

(Fix System.Diagnostics.StackFrame)مشکل کاهش عملکرد System.Diagnostics.StackFrame را برطرف کنید

برای حل این مشکل، مایکروسافت(Microsoft) استفاده از یکی از روش های زیر را توصیه می کند.

1] از سازنده دیگری برای StackFrame استفاده کنید که آرگومان بولی را می گیرد(1] Use a different constructor for StackFrame that takes a Boolean argument)

این راه حل ترجیحی است.

اگر توسعه دهندگان برنامه قادر به ایجاد تغییرات در برنامه های خود هستند، با System.Diagnostics.StackTrace تماس بگیرید . (call the) سازنده #ctor( Boolean ) با استفاده از یک آرگومان نادرست برای جلوگیری از گرفتن اطلاعات منبع. با این کار بخشی از کد که در آن عملکرد کاهش یافته است، جلوگیری می کند.

2] بازگشت یا ارتقاء به آخرین نسخه ویندوز 10(2]  Rollback or upgrade to the latest Windows 10 version)

در این روش، اگر با این مشکل مواجه هستید و در حال حاضر از آخرین نسخه ویندوز 10(Windows 10) استفاده نمی‌کنید، به نسخه/بیلد  قبلی برگردید یا upgrade to the latest version/buildویندوز 10(Windows 10) ارتقا دهید . همچنین در صورت وجود، .NET Framework 4.7.1 را از رایانه خود حذف نصب کنید و سپس نسخه قبلی یا آخرین نسخه NET Framework را دانلود(download) و نصب کنید .

Hope this helps!



About the author

من یک کارشناس باتجربه ویندوز 10 و 11/10 هستم که هم در مرورگرها و هم در برنامه های گوشی های هوشمند تجربه دارم. من بیش از 15 سال مهندس نرم افزار هستم و با تعدادی از شرکت های بزرگ از جمله مایکروسافت، گوگل، اپل، یوبی سافت و غیره کار کرده ام. من همچنین توسعه ویندوز 10/11 را در سطح کالج تدریس کرده ام.



Related posts