مقایسه عملکرد درایور شبکه در نسخه های 10 زبان برنامه نویسی

گروهی از محققان دانشگاه های آلمان опубликовала یافته ها آزمایش، که طی آن 10 نسخه از یک درایور استاندارد برای کارت های شبکه 10 گیگابیتی Intel Ixgbe (X5xx) به زبان های برنامه نویسی مختلف توسعه یافت. درایور در فضای کاربر اجرا می شود و در C، Rust، Go، C#، Java، OCaml، Haskell، Swift، JavaScript و Python پیاده سازی می شود. هنگام نوشتن کد، تمرکز اصلی بر روی دستیابی به بهترین عملکرد ممکن با در نظر گرفتن ویژگی های هر زبان بود. همه گزینه ها از نظر عملکرد یکسان هستند و از حدود 1000 خط کد تشکیل شده اند. تحولات پروژه گسترش تحت مجوز BSD

نسخه Rust درایور از نظر عملکرد بسیار نزدیک به درایور مرجع در زبان C است. تحت یک بار با ارسال همزمان بلوک‌های 32 بسته، درایور Rust کمی عقب بود، اما در آزمایش‌هایی با بیش از 32 بسته در هر بلوک، سرعت عملاً تفاوتی با درایور C نداشت و عملکردی در سطح پردازش 28 میلیون نشان داد. بسته ها در ثانیه روی سروری با پردازنده Xeon E3-1230 v2 3.3 گیگاهرتز.

مقایسه عملکرد درایور شبکه در نسخه های 10 زبان برنامه نویسی

جایگاه بعدی از نظر عملکرد توسط درایورهای زبان های Go و C# اشغال شد که نتایج نسبتاً نزدیکی را نشان دادند (درایور Go در تست هایی با بلوک های حداکثر 16 بسته برنده شد و در تست هایی با بیش از 16 بسته شروع به از دست دادن اندکی کرد. در یک بلوک). با 256 بسته در هر بلوک، اوج عملکرد درایور C# تقریباً 28 میلیون بسته در ثانیه و درایور Go تقریباً 25 میلیون بسته در ثانیه بود.

بعدی، با نتایج نسبتا نزدیک، رانندگان برای
جاوا، OCaml و Haskell که قبلاً به طرز محسوسی از گزینه های در نظر گرفته شده قبلی عقب مانده بودند و نتوانستند بر 12 میلیون بسته در ثانیه غلبه کنند. درایورهای سوئیفت و جاوا اسکریپت تأخیر بیشتری را نشان دادند و قادر به پردازش جریان در سطح 5 میلیون بسته در ثانیه بودند.

رتبه برتر توسط درایور پایتون تکمیل شد که قادر به پردازش تنها 0.14 میلیون بسته در ثانیه بود. پیاده سازی Python برای ارزیابی سرعت مفسرها بدون JIT و بدون بهینه سازی خاص مورد استفاده قرار گرفت (کد با استفاده از CPython 3.7 اجرا شد و با PyPy سازگار نبود، اما اشاره شده است که بهینه سازی ساختارهای ذخیره سازی داده می تواند عملکرد را حدود 10 برابر بهبود بخشد. ).

علاوه بر این، آزمایش‌های تأخیر برای نشان دادن اثربخشی بافر و تأثیر جمع‌آورنده زباله انجام شد. این آزمایش تاخیر را پس از ارسال هر بسته توسط راننده در مقایسه با زمان دقیق ارسال آن اندازه گیری کرد. رهبران همچنان درایورهای C و Rust بودند که نتایج آنها برای جریان 1 میلیون بسته در ثانیه (تقریباً 20 میکرو ثانیه) عملاً غیرقابل تشخیص بود. راننده Go عملکرد خوبی داشت و تنها کمی از رهبران عقب بود و همچنین در سطح 20 میکرو ثانیه باقی ماند. درایور سی شارپ تاخیرهایی در حدود 50 میکروثانیه نشان داد.
بیشترین تاخیرها توسط جاوا اسکریپت و درایورهای جاوا (تأخیر بیش از 300 میکرو ثانیه) نشان داده شد.

مقایسه عملکرد درایور شبکه در نسخه های 10 زبان برنامه نویسی

این مطالعه به منظور ارزیابی امکان توسعه درایورها و اجزای سیستم عامل در زبان های سطح بالاتر از C انجام شد. در حال حاضر 39 مشکل از 40 مشکل حافظه در لینوکس مربوط به درایورها است، بنابراین مسائل مربوط به استفاده از زبان امن تر و انتقال درایورها به خارج از هسته و به فضای کاربر مرتبط باقی بماند و سازندگان در حال حاضر به طور فعال در این جهت آزمایش می کنند (به عنوان مثال، Google یک پشته TCP برای سیستم عامل ایجاد کرده است. گل گوشواره به زبان Go، شرکت CloudFlare ایجاد شده با اجرای پروتکل QUIC در Rust، اپل پشته TCP را در دستگاه های تلفن همراه به فضای کاربر منتقل کرده است.

در طول کار، به این نتیجه رسیدیم که زبان Rust بهترین نامزد برای توسعه درایور است. قابلیت های Rust مشکلات مربوط به مدیریت حافظه در سطح پایین را با هزینه تقریباً 2% تا 10% کاهش عملکرد در مقایسه با درایورهای C برطرف می کند. Go و C# همچنین برای ایجاد اجزای سیستم در شرایطی که تأخیر زیر میلی‌ثانیه‌ای ناشی از جمع‌آوری زباله قابل قبول است، مناسب در نظر گرفته می‌شوند.

منبع: opennet.ru

اضافه کردن نظر