pety2001pety

استفاده از توابع برنامه را کند تر می کند؟

pety2001pety ۱۳۹۷/۱۲/۲۹ زبان برنامه‌نویسی سی‌پلاس‌پلاس

سلام.در سی پلاس پلاس.ممکنه در مواردی اگر از توابع استفاده کنیم.برناممون کند تر اجرا بشه نسبت به وقتی که از توابع در کدهامون استفاده نمی کنیم؟مثلا یک حلقه ی چند هزار تایی داریم.به جایی که از یک تابعی که خودمون نوشتیم برای ماکسیمم گرفتن بین دو عدد تو حلقه استفاده کنیم.همون کدهای تابع رو توی حلقه بنویسیم. و از تابع از پیش نوشته استفاده نکنیم.ممکنه در مواردی استفاده ازتوابع، باعث کند شدن برنامه بشن؟؟؟تا چه حد در سرعت تاثیر گذاره و در چه مواردی؟؟

پاسخ‌ها به این تاپیک
مهدی ویژه
مهدی ویژهتوسعه دهنده اندروید
۱۳۹۸/۰۱/۰۲

اصولا بهینگی کد ها را با معیاری به نام مرتبه اجرایی اندازه گیری میکنند. هر چقدر که این معیار کوچکتر باشد کد با هزینه کمتری(مصرف رم کمتر و زمان کوتاه تر) اجرا خواهد شد. از آنجا که کد هایی که به صورت پیش فرض در فانکشن های زبان ها نوشته شدند سعی شده اند که مرتبه اجرایی خوبی و در خیلی موارد بهترین مرتبه اجرایی که یک کد می‌توان اجرا شود (ضرب ماتریس ها به طور مثال) را داشته باشند در نتیجه می‌توان مطمئن بود که زمان اجرا این کد ها در بهترین حالت خود قرار دارند.

pety2001pety
pety2001pety
۱۳۹۸/۰۱/۰۵

ممنونم.ببینید من تست زدم یکبار اینمدلی:

for (int i = 0;i < 999999;i++)
{
 int t = 1;
 int as = 0;
 as += 1212;
 as *= 2222;
 t = as + 1212;
 if (t > 12)t = 12;
 else if (t < 1111)t = 12;
}

و یکبار هم این مدلی که ابتدا یک تابع تعریف کردم و بعدش تابع رو تو حلقه انداختم:

MStatus deleteDef(int &aaa)
{
	int as = 0;
	as += 1212;
	as *= 2222;
	aaa = as + 1212;
	if (aaa > 12)aaa = 12;
	else if (aaa < 1111)aaa = 12;
	return true;
}
for (int i = 0;i < 999999;i++)
{
	int t = 1;
	deleteDef(t);
}

خوب سرعت اجرای کد بالایی میانگین چهار برابر مدل اولی بود.یعنی وقتی از تابع deleteDef استفاده کردم، سرعت به یک چهارم رسید!!!

در پاسخ به

مهدی ویژه
مهدی ویژهتوسعه دهنده اندروید
۱۳۹۸/۰۱/۰۶

متشکر.

مطمئنا اجرا کد بالا زمان کوتاه تری خواهد بود زیرا شما در کد پایین، 999999 یک تابع را صدا زدید، از آنجا که برای صدا زدن هر دفعه تابع، پشته ای از اطلاعات ورودی تابع و سطح دسترسی متغیر ها و ...(این مبحث خارج از حوصله این جواب است) ساخته می‌شود در نتیجه مصرف رم و سرعت اجرایی پایین تری خواهد داشت. اگر شما حلقه for را به داخل تابع انتقال دهید، سرعت اجرا دو کد شما برابر خواهد شد.

در پاسخ به