یکی از حواشی و رقابتهای همیشگی در دنیای توسعه نرمافزار، مقایسه کارایی (Performance) برنامههای دسکتاپ است. در روزگاری که اکثر پیامرسانها و نرمافزارهای مدرن دسکتاپ (مانند واتساپ، اسلک، دیسکورد و تایپسکریپت/VS Code) حافظه رم (RAM) سیستم را ببلعند و حتی در قویترین سختافزارها تاخیرهای ریز (Lag) نشان دهند، نسخه دسکتاپ تلگرام (Telegram Desktop) مثل یک معجزه مهندسی عمل میکند: اجرای آنی، مصرف حافظه رم در حد چند ده مگابایت، سرعت اسکرول ۶۰/۱۲۰ فریم بر ثانیه و واکنشگرایی بدون وقفه حتی هنگام جابهجایی هزاران پیام و فایل چندرسانهای.
پاسخ کوتاه و مستقیم به سوال اول این است: نسخه دسکتاپ تلگرام (از جمله نسخه ویندوز) کاملاً به زبان ++C نوشته شده است.
برخلاف تصور بسیاری از کاربران که فکر میکنند تلگرام از فریمورکهای وب محور استفاده میکند، سورسکد پروژه Telegram Desktop (TDESK) بر پایه استاندارد مدرن ++C17 و ++C20 بنا شده است.
چرا ++C؟
تلگرام دسکتاپ برای مدیریت پنجرهها، Event Loop و اجزای پایه رابط کاربری (UI) از فریمورک قدرتمند و چندپلتفرمی Qt (کیوت) استفاده میکند. اما نکته کلیدی اینجاست: تلگرام از رندرینگ استاندارد و سنگین Qt Widgets یا Qt Quick/QML استفاده نمیکند!
تیم توسعه تلگرام به رهبری جان پاکر (John Seamons / John Veitch - سازنده اصلی Telegram Desktop)، بخش رندرینگ گرافیکی Qt را تقریباً بازنویسی کردهاند.
رندرینگ سفارشی (Custom Painting Engine)
در برنامههای معمولی Qt، هر دکمه یا متن یک آبجکت کامل در حافظه است که درخت کامپوننتها (Component Tree) را سنگین میکند. اما در تلگرام:
برای درک علل سبک بودن تلگرام، باید آن را با رقبای اصلیاش مقایسه کنیم.
عدم استفاده از Electron.js (بزرگترین تفاوت با رقبا)
اکثر برنامههای دسکتاپ امروزی (واتساپ دسکتاپ قبلی، دیسکورد، اسلیک، تلگرام وب، نوتیفیکیشنها و...) بر پایه فریمورک Electron ساخته شدهاند.
الکترون در واقع یک مرورگر کامل Chromium به همراه محیط اجرای Node.js را در قالب یک فایل .exe بستهبندی میکند. یعنی وقتی دیسکورد یا واتساپ را باز میکنید، در واقع یک مرورگر کروم جدید باز کردهاید که ۲۰۰ تا ۶۰ و ۵۰۰ مگابایت رم را فقط برای بالا آمدن موتور مرورگر مصرف میکند!
در مقابل، تلگرام دسکتاپ یک Native Executable واقعی است:
[ Electron Apps (Discord, Slack, Whatsapp) ]
+------------------------------------------+
| Your Application Code (JS/HTML/CSS) |
+------------------------------------------+
| Node.js Engine |
+------------------------------------------+
| Chromium Browser Engine (V8, Blink, etc)|
+------------------------------------------+
| Windows OS / Hardware |
+------------------------------------------+
--> RAM Consumption: 500MB - 1.5GB
--> Startup Time: 3 - 8 Seconds
[ Telegram Desktop (C++ / Custom Qt) ]
+------------------------------------------+
| Telegram Code & Custom UI Engine (C++) |
+------------------------------------------+
| Native Win32 / Direct2D / OpenGL APIs |
+------------------------------------------+
| Windows OS / Hardware |
+------------------------------------------+
--> RAM Consumption: 30MB - 80MB
--> Startup Time: < 0.5 Seconds
پروتکل شبکه اختصاصی MTProto و کتابخانه TDLib
بخش عمدهای از سرعت تلگرام در دریافت و ارسال پیام، مربوط به پروتکل ارتباطی آن یعنی MTProto است:
مدیریت هوشمندانه حافظه و کش (Cache Management)
تلگرام دسکتاپ از حافظه رم و دیسک به شکلی تهاجمی اما هوشمندانه محافظت میکند:
معماری Multi-Threading کاملاً ایزوله
در تلگرام دسکتاپ، رابط کاربری (UI Thread) به هیچ عنوان منتظر ورودی/خروجی (I/O) نمیماند:
نتیجه این معماری این است که حتی اگر ۵ فایل با سرعت بالا در حال دانلود باشند و دیتابیس در حال ذخیرهسازی هزاران پیام باشد، رابط کاربری برنامه کوچکترین افت فریمی (Lag) تجربه نمیکند.
اگر سورسکد تلگرام دسکتاپ را در گیتهاب (telegramdesktop/tdesktop) بررسی کنید، با سهلایه اصلی روبهرو میشوید:
برای کامپایل نسخه ویندوز از کامپایلر MSVC (Microsoft Visual C++) یا MinGW استفاده میشود که با پرچمهای بهینهسازی حداکثری (/O2 یا /Ox برای کارایی حداکثری در حجم و سرعت) کامپایل میگردد.
پاسخ به راز موفقیت تلگرام دسکتاپ در یک جمله خلاصه میشود: احترام به منابع سیستم و اجتناب از میانبرهای توسعه نرمافزار.
در حالی که صنعت امروزی نرمافزار به سمت توسعه سریع با فریمورکهای وب-پایه (مثل الکترون) رفته که نتیجه آن برنامههای سنگین و کند است، تیم تلگرام مسیر سختتر یعنی توسعه بومی (Native C++) و طراحی اختصاصی موتورهای رندر و شبکه را انتخاب کرد.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.