ورود

نسخه کامل مشاهده نسخه کامل : محاسبه سربار اضافه در متد های استاتیک و غیراستاتیک



Life24
29-11-2013, 22:28
سلام

دوستان گفته شده است،که بهتر است که هنگامی که تعداد استفاده ما محدود است، از متد ایستا یک کلاس استفده کنیم،تا یک شی ایجاد کرده و سپس از تابع استفاده کنیم.
همانند:

Regex re = new Regex("e");
string my = "Regular Expression";
Console.WriteLine(re.Match(my));
//--------------
Console.WriteLine(Regex.Match(my,"e"));



امکان داره عزیزان سربار ناشی از ایجاد شی و استفاده از متد استاتیک را شرح دهند؟ که چرا با اهمیت بود اینقدر که براش این طوری 2 راه گذاشتند؟
این طور که بنده متوجه شدم،در متدهای استاتیک کلاس Regex وقتی یکبار الگو را بخواهیم تطتبیق دهیم، و کامپایل میشود.تا 15 بار نتایج قبل را در خود Cache میکند،که این مقدار قابل افزایش است.(یعنی یکبار کامپایل و سری های بعد از کش استفاده می شود)
اما وقتی شی بسازیم هر بار دوباره کامپایل می کند.
با این حساب پس همیشه بهتر است که استاتیک استفاده کنیم؟!

_H2_
22-12-2013, 23:16
سلام
شی new شده بشدت برای اجرای بارها با همان الگو بهینه شده است.
در واقع اگر بخواهید دوبار تطبیق یک الگو را بررسی کنید با قطع میتوان گفت، ساخت نمونه شی بازده بیشتری از متدهای استاتیک موجود دارد.
متدهای استاتیک کلاس فوق صرفاً جهت سهولت استفاده و کاهش کدنویسی ایجاد شده اند و دلیل دیگری نداشته اند و در پشضمینه نمونه ای از کلاس regex را ساخته و فراخوانی میکنند.

پس، اگر میتوانید شی regex یک الگو را تولید و در جایی نگاه دارید تا در دفعات بعد از همان شی استفاده کنید، حتماً انجامش دهید وگرنه از متدهای استاتیک کلاس فوق استفاده کنید.
موفق باشید.

Life24
23-12-2013, 00:39
ممنون،
بحث cache در متد استاتیک این کلاس چطور است؟

_H2_
29-12-2013, 01:14
سلام


بحث cache در متد استاتیک این کلاس چطور است؟

بله متد static این کلاس کشی دارد ولی در نهایت مشخص است که این کش نمیتواند با نمونه سازی مستقیم کلاس برای یک الگوی خاص رقابت کند.
اصولاً وقتی کلاسی وجود دارد که برای یک الگوی مشخص و خاص تولید میشود، معلوم است که برای آن الگوی خاص بهینه شده.

درست است که new کردن Regex یک بار این شبه کامپایل یا هر بهینه سازی ممکنی را انجام میدهد ولی یکبار است و درعوض شما میتواند صدها بار از آن استفاده کنید.

ولی بهرحال چون سوال اولیه شما روی "بازدهی" بوده است، بازدهی چیزی نیست که بتوان با سخن رانی عددش را مشخص کرد!
پس عملاً امتحان کردم.

یکبار خیلی معمولی با حلقه for انجام دادم و هر بار 5 آزمایش مجزا با exe کامپایل release انجام شد.
نتیجه زمانی

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مشخص است که بازدهی متدهای استاتیک این کلاس کمتر است.
ولی موضوع وقتی جالب تر شد که برنامه آزمایش را پیچیده تر کردم.
این بار 64 ریسمان همزمان 8 الگوی متفاوت را روی 10 مقدار اجرا کردند و نتایج چنین شد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مشخص است که زیر بار-فشار این تفاوت بیشتر بیرون میزند و بجز دیدن این نتایج هم باز پیشبینی میکردم و حالا بیشتر پیشبینی میکنم که در زیر فشار ریسمان های بیشتر این تفاوت باز مشخص تر شود.

درنتیجه اگر الگوی مشخص و ثابتی دارید و میخواهید بارها بررسی اش کنید در new کردن regex شک نکنید.
موفق باشید.