از کلاس MethodImplattribute در C# به روش های درون خطی و بهبود سرعت اجرای برنامه های NET خود استفاده کنید.
کامپایلر فقط به موقع (JIT) جزء زمان اجرا زبان مشترک (CLR) در .NET است که کد زبان واسطه مشترک (CIL) را به کد بومی تبدیل می کند که توسط رایانه اجرا می شود. کامپایلر JIT کد CIL را در زمان اجرا کامپایل می کند ، از این رو نام. با این حال ، شما ممکن است اغلب بخواهید کامپایلر JIT را برای بهینه سازی عملکرد برنامه های خود تغییر دهید. برای دستیابی به این هدف می توانید ویژگی های خاص را در کد برنامه خود اعمال کنید.
کلاس methodimplattribute
در C# شما را قادر می سازد تا با تزئین روش با ویژگی ، به کامپایلر JIT یک روش را “درون خطی” کنید. Inlining یک بهینه سازی کامپایلر است که سرعت اجرای را با جایگزینی یک روش یا تماس عملکرد با کد روش یا عملکرد خوانده می کند.
بیایید بررسی کنیم که چگونه می توانیم از کلاس methodimplattribute
در C# استفاده کنیم تا روش را در برنامه های کاربردی .NET انجام دهیم.
ایجاد یک پروژه برنامه کنسول در ویژوال استودیو
اول از همه ، اجازه دهید یک پروژه برنامه کاربردی کنسول .NET در ویژوال استودیو ایجاد کنیم. با فرض نصب Visual Studio 2022 در سیستم شما ، مراحل ذکر شده در زیر را دنبال کنید تا یک پروژه برنامه جدید کنسول .NET Core ایجاد کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید” ، “برنامه کنسول” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- روی Next کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود” ، نام و مکان را برای پروژه جدید مشخص کنید.
- روی Next کلیک کنید.
- در پنجره “اطلاعات اضافی” که در مرحله بعد نشان داده شده است ، “.net 9.0 (پشتیبانی از اصطلاح استاندارد)” را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
- روی ایجاد کلیک کنید.
ما از این پروژه برنامه کنسول .NET 9 استفاده خواهیم کرد تا با نمونه های کد نشان داده شده در بخش های بعدی این مقاله کار کنیم.
چه اتفاقی می افتد وقتی یک روش نامیده می شود؟
هنگامی که یک روش نامیده می شود ، زمان اجرا یک قاب پشته جدید برای آن ایجاد می کند و آن را در پشته ذخیره می کند. این تکنیک ذخیره داده ها در پشته نیز به عنوان یک عمل فشار شناخته می شود. این قاب پشته حاوی ابرداده از روش ، یعنی پارامترهای روش ، متغیرهای محلی مربوط به روش ، آدرس بازگشت و سایر اطلاعات مربوطه است.
هنگامی که این روش اجرا می شود ، کامپایلر JIT متغیرها و پارامترهای محلی را در داخل قاب پشته اختصاص می دهد که برای روش اختصاص داده شده است. با اتمام اجرای ، زمان اجرا قاب پشته را برای روش از پشته حذف می کند. این همچنین به عنوان Popping شناخته می شود.
از این رو ، هزینه ای در ارتباط با تماس های روش وجود دارد زیرا کل این عملیات (ذخیره داده ها در پشته یا ثبت نام ، سپس حذف آن) منابع را مصرف می کند. این توضیح می دهد که چرا اجتناب از این سربار پرهزینه برای برنامه هایی که نیاز به عملکرد بالا دارند ضروری است.
روش ورود به سیستم چیست؟ چگونه کار می کند؟
در .NET ، روش ورود به روش به یک تکنیک بهینه سازی کامپایلر که توسط کامپایلر فقط در زمان (JIT) استفاده می شود ، اشاره دارد ، به موجب آن JIT جایگزین یک روش فراخوانی با بدنه روش خوانده می شود. از این رو ، در زمان اجرا ، هنگامی که برنامه در حال اجرا است ، به جای پریدن به روش برای اجرای دستورالعمل ها ، کد منبع درج شده روش به طور مستقیم اجرا می شود.
شما باید در صورت کوچک بودن روش ، یک روش را در نظر بگیرید ، یعنی فقط در صورتی که دارای چند خط کد باشد. علاوه بر این ، اگر می خواهید عملیات یا محاسبات پیچیده خاصی را در داخل حلقه ها انجام دهید ، استفاده از روش حاوی آن عملیات یا محاسبات پیچیده اغلب انتخاب خوبی است. توجه داشته باشید که کامپایلر JIT تصمیم می گیرد که آیا باید یک قطعه کد را درون آن قرار دهد یا نه
برای تعیین اینکه آیا یک روش باید در آن قرار بگیرد ، کامپایلر JIT هم اندازه و هم پیچیدگی روش را در نظر می گیرد. کامپایلر JIT برای جلوگیری از افزایش اندازه اجرایی ، از جلوگیری از بوی کد ، به عنوان مثال ، جلوگیری می کند. و از استفاده از روشهای پیچیده جلوگیری می کند تا باعث افزایش زمان تدوین و همچنین محدود کردن اندازه کد گردآوری شود.
کلاس methodimplattribute و methodimploptions
کلاس methodimplattribute
مربوط به system.runtime.compilerservice
فضای نام از یک مقدار methodimploptions
برای آگاهی از کامپایلر فقط در زمان (JIT) در مورد چگونگی اجرای این روش استفاده می کند. توجه داشته باشید مقادیر مختلف methodimploptions
مختلف وجود دارد ، از nooptimization
(به عنوان مثال ، کد نباید برای عملکرد بهینه شود) تا تهاجمی
(یعنی کد همیشه باید بهینه شود). دو مورد از گزینه ها ، noinlining
و angressiveinlining
، مربوط به روش های ورود به سیستم است.
کد زیر نشان می دهد که چگونه می توانید از کلاس methodimplattribute
برای تزئین یک روش در C#استفاده کنید.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MyExampleMethod()
{
//Some code
}
مقدار مقدار تهاجمی
برای methodimploptions
مورد استفاده در بالا ، JIT را آموزش می دهد تا در صورت امکان روش را خط کند. در مقابل ، مقدار noinlining
نشان می دهد که این روش نباید داخل آن قرار بگیرد.
لازم به ذکر است که با استفاده از [MethodImpl (MethodImploptions.AggressiveInlining)]
ویژگی در یک روش تضمین کننده استفاده از روش نیست. با استفاده از این ویژگی ، شما فقط به کامپایلر JIT مشخص می کنید که در صورت امکان ، روش باید وارد شود. به عبارت دیگر ، این ویژگی فقط یک پیشنهاد است ، نه یک دستورالعمل. در نهایت ، کامپایلر JIT تصمیم می گیرد که آیا این روش در زیر لاک قرار خواهد گرفت یا خیر.
کامپایلر JIT تصمیم می گیرد که آیا این روش باید بر اساس دو عامل که قبلاً در مورد آنها بحث کردیم ، اندازه و پیچیدگی روش را وارد کرد. در آخر ، به خاطر داشته باشید که باید از داخل آن استفاده شود و به طرز کم و متفکرانه استفاده شود. توصیه می شود قبل از تصمیم گیری در مورد اینکه آیا روشها باید در آن قرار بگیرند ، عملکرد روشهای خود را مشخص و معیار می کنید.
پست های مرتبط
نحوه ورود به روشهای با استفاده از MethodImplattribute در C#
نحوه ورود به روشهای با استفاده از MethodImplattribute در C#
نحوه ورود به روشهای با استفاده از MethodImplattribute در C#