Perbandingan prestasi pemacu rangkaian dalam versi dalam 10 bahasa pengaturcaraan

Sekumpulan penyelidik dari universiti Jerman ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° penemuan eksperimen, di mana 10 versi pemacu standard untuk kad rangkaian Intel Ixgbe (X10xx) 5-gigabit telah dibangunkan dalam bahasa pengaturcaraan yang berbeza. Pemacu berjalan dalam ruang pengguna dan dilaksanakan dalam C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript dan Python. Semasa menulis kod, tumpuan utama adalah untuk mencapai prestasi terbaik, dengan mengambil kira ciri-ciri setiap bahasa. Semua pilihan adalah sama dalam fungsi dan terdiri daripada kira-kira 1000 baris kod. Perkembangan projek sebar di bawah lesen BSD.

Versi Rust pemandu ternyata sangat hampir prestasinya dengan pemandu rujukan dalam bahasa C. Di bawah beban dengan penghantaran serentak blok 32 paket, pemandu Rust berada di belakang sedikit, tetapi dalam ujian dengan lebih daripada 32 paket setiap blok, kelajuan hampir tidak berbeza daripada pemandu C dan menunjukkan prestasi pada tahap pemprosesan 28 juta paket sesaat pada pelayan dengan CPU Xeon E3-1230 v2 3.3 GHz.

Perbandingan prestasi pemacu rangkaian dalam versi dalam 10 bahasa pengaturcaraan

Niche seterusnya dari segi prestasi diduduki oleh pemandu dalam bahasa Go dan C#, yang menunjukkan hasil yang agak hampir (pemandu Go menang dalam ujian dengan blok sehingga 16 paket, dan mula kalah sedikit dalam ujian dengan lebih daripada 16 paket dalam satu blok). Dengan 256 paket setiap blok, prestasi puncak pemacu C# adalah kira-kira 28 juta paket sesaat, dan pemacu Go adalah kira-kira 25 juta paket sesaat.

Seterusnya, dengan keputusan yang agak hampir, adalah pemandu untuk
Java, OCaml dan Haskell, yang sudah nyata ketinggalan di belakang pilihan yang dipertimbangkan sebelum ini dan tidak dapat mengatasi 12 juta paket sesaat bar. Pemacu Swift dan JavaScript menunjukkan ketinggalan yang lebih besar, dapat memproses strim pada tahap 5 juta paket sesaat.

Kedudukan teratas telah dilengkapkan oleh pemandu Python, yang mampu memproses hanya 0.14 juta paket sesaat. Pelaksanaan Python digunakan untuk menilai kelajuan jurubahasa tanpa JIT dan tanpa pengoptimuman khusus (kod itu dilaksanakan menggunakan CPython 3.7 dan tidak serasi dengan PyPy, tetapi diperhatikan bahawa pengoptimuman struktur penyimpanan data boleh meningkatkan prestasi kira-kira 10 kali ganda. ).

Selain itu, ujian kependaman telah dijalankan untuk menunjukkan keberkesanan penimbal dan kesan pemungut sampah. Ujian mengukur kependaman selepas setiap paket dimajukan oleh pemandu berbanding dengan masa yang tepat ia dihantar. Pemimpinnya masih pemacu C dan Rust, yang hasilnya hampir tidak dapat dibezakan untuk aliran 1 juta paket sesaat (kira-kira 20 Β΅s). Pemandu Go menunjukkan prestasi yang baik, hanya sedikit di belakang pendahulu dan juga kekal pada tahap 20 Β΅s. Pemacu C# menunjukkan kelewatan kira-kira 50 Β΅s.
Kelewatan paling lama ditunjukkan oleh pemacu JavaScript dan Java (latensi lebih daripada 300 Β΅s).

Perbandingan prestasi pemacu rangkaian dalam versi dalam 10 bahasa pengaturcaraan

Kajian itu dijalankan untuk menilai kemungkinan membangunkan pemacu dan komponen sistem pengendalian dalam bahasa peringkat lebih tinggi daripada C. Pada masa ini, 39 daripada 40 masalah memori dalam Linux berkaitan dengan pemacu, jadi isu penggunaan bahasa yang lebih selamat dan memindahkan pemacu keluar dari kernel dan ke ruang pengguna kekal relevan dan pengeluar telah pun secara aktif bereksperimen ke arah ini (contohnya, Google telah membangunkan tindanan TCP untuk OS Fuchsia dalam bahasa Go, syarikat CloudFlare dicipta pelaksanaan protokol QUIC dalam Rust, Apple telah mengalihkan susunan TCP pada peranti mudah alih ke dalam ruang pengguna).

Dalam perjalanan kerja, telah disimpulkan bahawa bahasa Rust adalah calon terbaik untuk pembangunan pemandu. Keupayaan Rust menghapuskan masalah yang berkaitan dengan pengurusan memori peringkat rendah pada kos kira-kira 2% hingga 10% kehilangan prestasi berbanding pemacu C. Go dan C# juga dianggap sesuai untuk mencipta komponen sistem dalam situasi di mana kependaman sub-milisaat yang disebabkan oleh kutipan sampah boleh diterima.

Sumber: opennet.ru

Tambah komen