خانه توسعهدهنده تکنولوژی بکاند جنگو آیا جنگو یک فریمورک سریع است؟
آیا جنگو یک فریمورک سریع است؟

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

همانطور که میبینید جنگو در همهی تستها جزء کندترین فریمورکها است، اما این مدل اندازهگیری چندان مناسب نیست؛ چون اولاً این پروژه به پروژههای دنیای واقعی آنقدر نزدیک نیست و کمتر پیش میآید که ما بخواهیم یک فایل ثابت را برای همهی کاربران بفرستیم یا بهعنوان مثال در ExpressJS فقط 3 لایهی ساده از middlewareها وجود دارد، ولی در جنگو مجموعهی بزرگی از middlewareها وجود دارد که کارهای مختلفی روی ریکوئست انجام میدهند. (middlewareها عملکردهای خاصی را در طول مسیر روی request انجام میدهند.)
Performance چیست؟
وقتی یک نفر به شما میگوید که یک فریمورک خیلی کند است، باید از او بپرسید که در چه زمینهای کند است و چرا این کندبودن اهمیت دارد؟
بهطورکلی برای بهینهتر کردن سایت دو هدف وجود دارد : اول اینکه کاربر تجربهی بهتری از کار با سایت داشته باشد و دوم اینکه هزینههای سرور و نگهداری سایت پایین بیاید. بیایید به اولی بپردازیم. وقتی کاربر با سایت کار میکند دو مورد اهمیت پیدا میکنند:
- Response time یعنی زمانی که کاربر باید صبر کند تا صفحه برایش لود شود.
- Concurrency یعنی چند کاربر میتوانند بهطور همزمان از سایت استفاده کنند.
در ادامه دربارهی این دو پارامتر بیشتر صحبت میکنیم.
Response time در جنگو

کاربران دوست ندارند که برای لودشدن صفحه منتظر بمانند؛ پس هرچه صفحه سریعتر لود شود، کاربران از عملکرد سایت شما رضایت بیشتری دارند. اما رابطهی بین زمان لودشدن صفحه و میزان رضایت کاربر، یک رابطهی خطی نیست؛ برای مثال اگر صفحهی وبسایت شما قبلاً در 5 ثانیه لود میشده و الان کاری کردهاید که در 1 ثانیه لود میشود، این بهبود در سایت شما کاربر را خوشحال میکند. حتی اگر صفحهای قبلاً در 500 میلیثانیه لود میشده و الان در 100 میلیثانیه لود میشود، باز هم این بهبود باعث رضایت بیشتر کاربران میشود. ولی اگر سرعت لودشدن را از 50 میلیثانیه به 10 میلیثانیه برسانید، احتمالاً کسی متوجه این تغییر نمیشود. پس وقتی میگویند این فریمورک از آن فریمورک 5 برابر سریعتر است، لزوماً به این معنی نیست که قرار است تجربهی کاربری خیلی بهتری را برای کاربران فراهم کند.
اما با انجام برخی کارها میتوان Response time را در پروژهها کاهش داد. برای مثال:
۱. کاهش دادن تعداد کوئریها
هر بار که شما میخواهید به دیتابیس دسترسی داشته باشید و از آن اطلاعات بگیرید، مقداری زمان صرف میشود. مخصوصاً اگر بخواهید فیلتر کنید و کوئریهای پیچیده بزنید، زمان زیادی صرف و سایت شما کندتر میشود. پس هرچقدر بتوانید بهینهتر کوئری بزنید، Response time کمتری هم خواهید داشت.
۲. کش کردن دادهها
اگر قرار است از دیتایی در آینده استفاده کنید، بهتر است که آن دیتا را کش کنید تا نیاز نباشد که دوباره زمانی صرف ارسال دیتا از سمت سرور شود. جنگو این امکان را به شما میدهد که دادههایی که میخواهید را در لایهی کش ذخیره کنید، بدون اینکه نیاز باشد کل صفحه ذخیره شود. با این کار شما میتوانید زمان قابلتوجهی ذخیره کنید که به افزایش سرعت سایت شما منجر میشود.
۳. قانون DRY
قانون (Don’t Repeat Yourself یا DRY) یک قانون مهم در برنامهنویسی است. همیشه سعی کنید آبجکتها یا تابعهایی که وجود دارند را دوباره ننویسید. این تکرار و دوبارهنوشتن میتواند باعث کند شدن کد شما شود که در نهایت Response time را افزایش میدهد.
در داکیومنت جنگو هم راههای زیادی برای افزایش سرعت و بهرهوری گفته شده است که شما با استفاده از آنها میتوانید سرعت یک اپ جنگو را چندبرابر کنید. لازم به ذکر است که مهارت برنامهنویس و شیوهای که برای نوشتن کد انتخاب میکند هم تأثیر بسزایی در سرعت برنامه دارد.
بهطورکلی جنگو مشکلی از لحاظ سرعت برای بیشتر پروژهها ندارد، ولی اگر پروژهای دارید که حتی 100 میلیثانیه هم برایتان مهم است – مثلاً پروژههایی که با بورس و معاملات سهام و رمزارز کار میکنند – بهتر است که از فریمورکهای دیگر استفاده کنید. اما اگر 500 میلیثانیه و 600 میلیثانیه آنقدر برایتان فرقی نمیکند، استفاده از جنگو بسیار پیشنهاد میشود.
Concurrency در جنگو
همان طور که گفته شد Concurrency یعنی چند کاربر میتوانند بهطور همزمان از سایت استفاده کنند. یکی از مسئلههای اصلی در Concurrency ارتباط برقرارکردن با دیتابیس و دریافت دیتا از آن است. در اینجا چیزی که خیلی میتواند تأثیرگذار باشد مهارت برنامهنویس، استفادهی بهینه از دیتا و کمکردن تعداد ریکوئستها به دیتابیس است.
مسئول رسیدگی به Concurrency در جنگو، سرور wsgi ( Web Server Gateway Interface) است. wsgiهای مختلفی در پایتون وجود دارد که از جملهی آنها میتوان به Bjoern ،Gunicorn، Meinheld و … اشاره کرد که هرکدام مزیتهای خاصی داشته و از پرفورمنس بالایی نیز برخورداند.
پس در نهایت میتوان گفت که concurrency در جنگو بیشتر به شما و قدرت سروری که میتوانید تهیه کنید بستگی دارد و هرچه رم و هستههای پردازنده سرور خود را ارتقا دهید جنگو هم با شما همراهی کرده و امکان افزایش concurrency را میدهد.
برای اینکه بفهمید با سروری که تهیه کردید چه مقدار concurrency خواهید داشت، میتوانید از ابزار Locust استفاده کنید که کاربران را شبیهسازی کرده و با ارسال تعداد زیادی ریکوئست سایت شما را به چالش میکشد.
Performance از زاویه دیگر

از زاویهی دیگری هم میتوان به Performance نگاه کرد و آن بهرهوری خود شما بهعنوان یک دولوپر است. اینکه شما بتوانید پروژهی خود را زودتر تمام کرده یا باگها را سریعتر فیکس کنید و وقت بیشتری برای اضافه کردن featureهای جدید داشته باشید هم نوعی بهرهوری محسوب میشود که در این مورد جنگو حرفهای زیادی برای گفتن دارد. از داکیومنتهای گسترده گرفته تا سؤالات متعددی که در Stack Overflow و سایر سایتها جواب داده شدهاند و همچنین زبان پایتون که نسبت به بقیهی زبانها سادهتر و قابلفهمتر است؛ همه اینها باعث میشوند که شما بتوانید یک پروژهی جنگو را خیلی سریع و با بهرهوری بالا توسعه دهید.
نتیجهگیری
بهطورکلی جنگو بهرهوری مناسبی برای اکثر پروژهها دارد و پروژههای زیادی با این فریمورک نوشتهشدهاند؛ از Instagram و Spotify و Pinterest گرفته تا بسیاری از سایتهای ایرانی و خارجی دیگر. سادگیِ نوشتن و دیباگکردن هم مسئلهای است که واقعاً به محبوبیت این فریمورک اضافه کرده است. اما اگر شما پروژهای دارید که لازم است خیلی سریع باشد و میلیثانیهها هم برایتان اهمیت دارند یا اینکه سرور و سختافزارهای لازم برای اجرای پروژهی جنگو را ندارید، میتوانید از فریمورکهای دیگری که سرعت بالاتری دارند استفاده کنید.
اگر علاقهمند هستید بیشتر درباره جنگو بدانید، میتوانید سری به دورهی آموزش جنگو در کوئرا کالج بزنید.
