PDA

View Full Version : یک خط کد 70% سریعتر!



MRmoon
سه شنبه 11 آذر 1393, 19:20 عصر
یه خبر خیلی باحال دارم براتون .

با اضافه کردن یک خط به کد های کامپوزر حالا کامپوزر حدود 70% سریعتر کار میکنه!

https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799

soroush.r70
سه شنبه 11 آذر 1393, 20:42 عصر
یه توضیح بیشتر در موردش میشه بدی و روش کارش

beh3000
چهارشنبه 12 آذر 1393, 08:19 صبح
کامپوزر سریعتر کار میکنه یعنی کدهای php مون سریعتر اجرا میشه ؟

کجا رو باید تغییر داد ؟

اصلا چیکار میکنه این کد ؟ احتمالا یه چیزهایی رو نادیده میگیره دیگه ؟ مشکلی بوجود نیاد ؟

MMSHFE
چهارشنبه 12 آذر 1393, 09:08 صبح
این کد باعث میشه کامپوزر سریعتر کار کنه. فکر نمیکنم ربطی به کدهای PHP شما داشته باشه.

beh3000
چهارشنبه 12 آذر 1393, 12:07 عصر
اصلا این کامپوزر چی هست ؟ به دردمون میخوره ؟ من ک نمیدونم اصلا چیکار میکنه

MRmoon
پنج شنبه 13 آذر 1393, 09:48 صبح
کامپوزر مثل یه جور مدیریت نسخه هستش. برا پکیج های php. مثلا شما اگه بخوای با هر کدوم از فریم ورک های معروف کار کنی از composer استفاده می کنن.

Persian_Scouser
پنج شنبه 13 آذر 1393, 11:00 صبح
این کد باعث میشه کامپوزر سریعتر کار کنه. فکر نمیکنم ربطی به کدهای PHP شما داشته باشه.

چون تمام Dependency ها و پکیج ها از طریق کامپوزر Autoload میشه در نتیجه کدهای PHP هم سریع تر اجرا میشه ، درست میگم؟


خیلی عجیبه این همه مدت متوجه موضوع نشده بودن ، جالبه با آپدیت نسخه جدید کامپوزر بین 30 تا 70 درصد سرعت اجرای پروژه بیشتر میشه و رم کمتری هم نسبت به قبل استفاده میشه ، چیزی که متوجه شدم اینه که قبل از اجرای gc_disable توسط کامپوزر یعنی تو نسخه های قبلی ، هر چی تعداد پکیج ها بیشتر میشد در نتیجه تعداد Object بیشتری در Root buffer ذخیره میشد و وقتی پر میشد پی اچ پی از طریق تابع gc_collect_cycles سعی می کرد برای هر تک Object دقیقا یک فضای خالی در Root buffer ایجاد کنه در نتیجه بارها و بارها این تابع برای ایجاد فضای خالی در buffer اجرا میشد و منابع بیشتری از سیستم استفاده میشد.


با این دستور کامپوزر خودتون رو آپدیت کنید :


composer self-update

MMSHFE
پنج شنبه 13 آذر 1393, 11:51 صبح
کامپوزر فقط نرم افزارهای لازم رو دریافت میکنه و بعد از اون دیگه کدهای PHP شما هستن که اجرا میشن. هنوز هم فکر میکنم این مسئله فقط باعث افزایش سرعت دانلود پروژه (موقع ایجاد) و درنتیجه افزایش سرعت ساخت پروژه در مرحله اول و با کمک کامپوزر میشه و ربطی به سرعت اجرای خود اسکریپت شما نداره.

Persian_Scouser
پنج شنبه 13 آذر 1393, 12:23 عصر
کامپوزر فقط نرم افزارهای لازم رو دریافت میکنه و بعد از اون دیگه کدهای PHP شما هستن که اجرا میشن. هنوز هم فکر میکنم این مسئله فقط باعث افزایش سرعت دانلود پروژه (موقع ایجاد) و درنتیجه افزایش سرعت ساخت پروژه در مرحله اول و با کمک کامپوزر میشه و ربطی به سرعت اجرای خود اسکریپت شما نداره.


دریافت پکیج ها فقط یه بخش از کاری هست که کامپوزر انجام میده ، کار اصلیش autoload کلاس ها از طریق استاندارد PSR-0 و PSR-4 هست که بدیهیه که تو Runtime هست ، آپدیت اخیر سرعت autoload رو بالاتر میبره نه سرعت دانلود .

این توییت Jordi Boggiano برنامه نویس اصلی کامپوزر هست :




From all the feedback it seems improvement is between 30-90% of runtime reduction, and nobody screaming fire yet!


https://twitter.com/seldaek/status/539736497155756032


همونطور که میبینید دقیقا به بهبود سرعت 30 تا 90 درصدی در Runtime اشاره کرده

انتونی فریرا تو مقاله اخیرش به صورت مفصل و تخصصی نقش تابع gc_disable و نقشش تو بالا رفتن سرعت کامپوزر رو توضیح داده ، همچنین گفته که استفاده از این تابع تو یه سری شرایط خاص میتونه بد باشه




http://blog.ircmaxell.com/2014/12/what-about-garbage.html

MMSHFE
پنج شنبه 13 آذر 1393, 12:41 عصر
والا من که تو تست بنچمارکی که گرفتم تفاوتی توی سرعت اجرای اسکریپتها مشاهده نکردم. منطقی هم نیست که توی اجرای اسکریپت تفاوتی ایجاد بشه. شاید منظور از Runtime زمانی باشه که فایلها دانلود شدن و سیستم کامپوزر داره اجزا رو برای کار در کنار هم تنظیم میکنه وگرنه بعد از اون توی اجرای اپلیکیشن دیگه کامپوزر نقشی نداره. درست مثل اینکه بیایم فرضاً بجای ایجاد یک پروژه جدید با فریمورک، فایل zip پروژه رو دستی دانلود کنیم. توی این حالت که نمیشه GC رو غیرفعال کرد.

arta.nasiri
پنج شنبه 13 آذر 1393, 13:03 عصر
دریافت پکیج ها فقط یه بخش از کاری هست که کامپوزر انجام میده ، کار اصلیش autoload کلاس ها از طریق استاندارد PSR-0 و PSR-4 هست که بدیهیه که تو Runtime هست ، آپدیت اخیر سرعت autoload رو بالاتر میبره نه سرعت دانلود .


منظور از runtime زمانی هست که composer داره پکیج ها رو دانلود میکنه و جایی که بهبود یافته بخش دانلود و نصب اولیه پروژه هاست. autoload یه امکان اختیاری هست که میشه تو پروژه include و ازش استفاده کرد و ربطی به سرعت اجرای composer نداره.

MMSHFE
پنج شنبه 13 آذر 1393, 13:47 عصر
صحبت منم همینه که منطقاً باید منظور، runtime خود کامپوزر باشه نه اپلیکیشن وب

olampiad
پنج شنبه 13 آذر 1393, 14:56 عصر
آیا گفته ایشون درسته
کسی تایید میکنه این حرفو؟
ممنون

MRmoon
پنج شنبه 13 آذر 1393, 15:10 عصر
این کد فقط سرعت خود کامپوزر رو بیشتر می کنه.

arta.nasiri
پنج شنبه 13 آذر 1393, 15:15 عصر
آیا گفته ایشون درسته
کسی تایید میکنه این حرفو؟
ممنون

بله درسته.

Persian_Scouser
پنج شنبه 13 آذر 1393, 18:37 عصر
والا من که تو تست بنچمارکی که گرفتم تفاوتی توی سرعت اجرای اسکریپتها مشاهده نکردم. منطقی هم نیست که توی اجرای اسکریپت تفاوتی ایجاد بشه. شاید منظور از Runtime زمانی باشه که فایلها دانلود شدن و سیستم کامپوزر داره اجزا رو برای کار در کنار هم تنظیم میکنه وگرنه بعد از اون توی اجرای اپلیکیشن دیگه کامپوزر نقشی نداره. درست مثل اینکه بیایم فرضاً بجای ایجاد یک پروژه جدید با فریمورک، فایل zip پروژه رو دستی دانلود کنیم. توی این حالت که نمیشه GC رو غیرفعال کرد.



منظور از runtime زمانی هست که composer داره پکیج ها رو دانلود میکنه و جایی که بهبود یافته بخش دانلود و نصب اولیه پروژه هاست. autoload یه امکان اختیاری هست که میشه تو پروژه include و ازش استفاده کرد و ربطی به سرعت اجرای composer نداره.


بله درسته ، تمام تصورم این بود از کدها توی Autoloader هم استفاده شده ولی اینطور نبود ، ،استفاده از GC_Disable با اینکه واقعا طبق چیزی که تو پست قبلی گفتم عملکرد PHP رو بهتر می کنه ولی اکیدا توصیه شده تو پروژه ها ازش استفاده نشه چون باعث بروز مشکل میشه.

arta.nasiri
پنج شنبه 13 آذر 1393, 19:11 عصر
بله درسته ، تمام تصورم این بود از کدها توی Autoloader هم استفاده شده ولی اینطور نبود ، ،استفاده از GC_Disable با اینکه واقعا طبق چیزی که تو پست قبلی گفتم عملکرد PHP رو بهتر می کنه ولی اکیدا توصیه شده تو پروژه ها ازش استفاده نشه چون باعث بروز مشکل میشه.

البته بستگی به نوع پروژه داره. وقتی میخواهیم تعداد زیادی از object ها رو لود میکنیم و باید تو حافظه بمونن (همون کاری که composer میکنه) میشه از gc_disable استفاده کرد.