چیز زیادی برای گفتن ندارم اما تلاشم اینه به زودی در رابطه با هر چیزی که میدونم و شاید دونستنش برای یه نفر دیگه مفید باشه بنویسم. مهندس نرمافزارم و 5-6 سالی میشه که به زبان PHP، برنامه مینویسم.
مقایسه سرعت لاراول و کدیگنایتر
سلام به همۀ کسایی که این پست رو میبینن. من خیلی وقت پیش این اکانت رو ساختم که به فریضۀ انتشار تجارب در زمینه های تخصصی خودم که بهشون برخوردم، بپردازم اما متاسفانه هیچ موقع فرصت نشد. امید بر اینکه این کار مستدام باشه.
خب، از اونجایی که من در چند سال اخیر بیشتر از همه، با زبان PHP کار کردم، احتمالا پست هام پیرامون این قضایا باشه. اولین پست در رابطه بنچمارکیه که اخیرا از سه فریمورک PHP یعنی کدیگنایتر نسخه 3 و کدیگنایتر نسخه 4 و لاراول 7 گرفتم.
قبل از هر چیزی یه توضیحات مختصری بر رخداد های اخیر کدیگنایتر بدم. همونطور که میدونید، کدیگنایتر، بعد از سالها بالاخره وا داد و با تغییراتی عظیم در پیکرۀ فریمورکش، رو به استفاده از namespace ها آورد که همین امر باعث شد کلا یک فریمورک کاملا جدا از نسخه سوم خلق بشه. پس قاعدتا پروژه های نوشته شده با نسخه سوم رو نمیشه با تغییرات کوچک به نسخه چهارم مهاجرت داد و اگر میخواید پروژه ای رو که با کدیگنایتر 3 نوشتید، به کدیگنایتر 4 بیارید، باید کلا اون پروژه از اول بنویسید!
در نسخه چهارم، کدیگنایتر بسیار بسیار شبیه لاراول شده و کد زدن رو بسیار راحت کرده اما چرا از اول این الگو رو پیش نگرفت و تا همین اواخر به همون پترن نسخه سوم ادامه میداد؟ دلیل اصلی اینکار اینه که کدیگنایتر تا نسخه سوم معتقد به سبُک بودن، سریع بودن و عدم پیچیدگی و دوری از شاخ و برگ های اضافه بود و اعتقاد بر این داشت، برنامه نویسهایی که احتیاج به فیچر دارن، باید اون فیچر رو خودشون خلق کنن!
اما در مقابل لاراول با داشتن فیچر های فراوان، کار برنامه نویس رو شدیدا راحت تر میکنه و این باعث میشه کد زدن تحت چهارچوب لاراول بسیار لذت بخش تر و قانونمندتر باشه. ولی این راحتی و ساختار منظم، بی هزینه نیست، و یکی از هزینه هایی که برای اون میپردازید اصل سرعته. نویسندگان کدیگنایتر بالاخره در سال 2018 به این قضیه تن دادن و گفتن ما با پایه و اساسی، مشابه نسخه سوم، نسخه ای جدید تر رو خلق کنیم که مثل لاراول، راحتی رو به ارمغان بیاره؛ با این تفاوت که نسخه سوم کماکان به قوت خودش باقی بمونه و هرکی خواست واسه خودش توی همون حال و هوا بچرخه و کد بزنه هرکی هم حال نکرد بیاد روی نسخه چهارم. پس در حقیقت نسخه چهارم، یک فریمورک "کاملا" مجزاست و اگر روی نسخه سوم دارید کار میکنید اصلا ضرورت مبرمی وجود نداره که به نسخه چهارم مهاجرت کنید.
خب بریم سراغ بنچمارک. قبل از هرچیزی بگم که بنچمارک ها، زمینه ها و انواع مختلفی دارند و هر سیستمی رو که میخوایم ازش بنچمارک بگیریم باید در ابعاد و حالت های مختلف اون رو تست کنیم که من امروز فقط یک حالت رو برای تست براتون آوردم و اونم "سرعت بارگذاری فریم ورک" هستش یعنی وقتی یک ریکوئست ارسال میشه، از اولین خط این برنامه تا آخرین خطش که تفسیر و اجرا میشه، چقدر زمان میبره؟
من یک قطعه کد بسیار ساده رو نوشتم که یک متد از کلاس های دریافت و بررسی ریکوئست های HTTP رو صدا میزنه و اون رو توی یک حلقه یک میلیون تایی انداختم که ببینم هر کدوم از این فریم ورک ها با چه سرعتی، آبجکت ها رو ایجاد میکنن؟ و در آخر هم این تست رو توی Pure PHP انجام دادم تا تفاوت رو ببینید. لازم به ذکره که از PHP/7.4.5 و آپاچی Apache/2.4.43 (که توی این تست مهم نیست) استفاده شده.
خب تست رو با لاراول نسخه 7 شروع میکنیم.
برای گرفتن بنچمارک از زبانهای اینترپرتری مثل PHP که خط به خط تفسیر میشن(البته اینجا همیشه اینطوری میگن در حالی که در حقیقت PHP یه زبان کامپایلریه! و کسی نمیدونه یا نرفته دنبالش که بدونه چرا. فقط همینطوری اساتید به شاگردا حرفاشون رو تکرار کردن)، ما باید همیشه دو قسمت از برنامه رو به عنوان نقاط A و B مشخص کنیم، و فاصله زمانی بین این دو نقطه رو حساب کنیم. بدین صورت، زمان اجرای کدهای بین این دو نقطه مشخص میشه. که در این تست من اومدم و نقطه اول رو، اولین خط از فایل index.php و نقطه دوم رو آخرین خط از این فایل در نظر گرفتم.
کد نقطه اول:
$startTime = microtime(true);
کد نقطه دوم:
echo "Time: " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n"
بعدش کلاسی تحت عوان Page ساختم و به مسیرش یه درخواست گت ارسال کردم که اون در خواست یک متد رو برای بررسی ریکوئست ارسالی، یک میلیون بار صدا میزنه:
و اما نتیجه تست:
حالا کدیگنایتر 4 که شبیه به لاراول شده.
قطعه کد CI 4:
همونطور که میبینیم کدیگنایتر 4 و لاراول سرعت مشابهی در این زمینه داشتن.
و اما کدیگنایتر 3:
و نتیجه تست:
همونطور که میبینید، کدیگنایتر 3، 0.24 ثانیه طول کشید که یک میلیون بار اشیائی رو از کلاس اینپوت بسازه و URL رو بررسی کنه!
و اما حالا Pure PHP یا کد پی اچ پی خالص و بدون فریم ورک:
که البته برای pure php مقایسه کاملا اشتباهیه چونکه من توی این کد زوایای مختلف فریم ورک هارو مثل اسکیپ کردن از پترن های XSS و ولیدیت کردن رشته ورودی و... رو دخیل نکردم و صرفا فقط یک خط کد برای گرفتن ریکوئست گت و تریم کردنش رو اجرا کردم. ولی باز به هر حال....
باز هم تاکید میکنم که این بنچمارک فقط برای حالت خاصی از تست ها هستش. توی قسمت بعدی احتمالا توان هندل کردن ریکوئست های همزمان یا کانکارنسی (concurrent requests) رو بررسی میکنم که ببینیم هر کدوم از این فریم ورک ها با چه سرعتی میتونن به مثلا 10 هزار ریکوئستی که همزمان ارسال شده پاسخ بدن.
امیدوارم این پست مفید بوده باشه.
مطلبی دیگر از این انتشارات
ثبت نام کارگاه کدنویسی تمیز در لاراول شروع شد ...
مطلبی دیگر از این انتشارات
ساخت فرم تماس با ما ساده در لاراول
مطلبی دیگر از این انتشارات
نسخه بتای Laravel Octane منتشر شد