Grupa istraživača s njemačkih sveučilišta rezultate , tijekom kojeg je na različitim programskim jezicima razvijeno 10 varijanti standardnog drajvera za 10-gigabitne mrežne kartice Intel Ixgbe (X5xx). Drajver radi u prostoru korisnika i implementiran je na jezicima C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript i Python. Prilikom pisanja koda, glavna pažnja posvećena je postizanju maksimalne moguće performanse uzimajući u obzir karakteristike svakog jezika. Po funkcionalnosti, sve varijante su identične i sastoje se od otprilike 1000 redaka koda. Postignuća projekta pod BSD licencom.
Varijanta drajvera na jeziku Rust pokazala se vrlo bliskom po performansama etalon drajveru na jeziku C. Pri opterećenju s istovremenom slanjem blokova od 32 paketa, Rust-drajver je malo zaostajao, ali u testovima s više od 32 paketa u bloku, gotovo se nije razlikovao od drajvera na C i pokazivao performanse na razini obrade 28 milijuna paketa u sekundi na serveru s CPU-om Xeon E3-1230 v2 3.3 GHz.
Sljedeću nišu po performansama zauzeli su drajveri na jezicima Go i C#, koji su pokazali dovoljno bliske rezultate (drajver na Go pobjeđivao je u testovima s blokovima koji uključuju do 16 paketa, dok je pomalo gubio u testovima s više od 16 paketa u bloku). Pri 256 paketa u bloku, vršna performansa drajvera na C# iznosila je otprilike 28 milijuna paketa u sekundi, dok je drajver na Go imao otprilike 25 milijuna paketa u sekundi.
Nakon toga, s dovoljno bliskim rezultatima, slijedili su drajveri na
Javi, OCaml i Haskell, koji su već značajno zaostajali za ranije razmatranim varijantama i nisu uspjeli preći granicu od 12 milijuna paketa u sekundi. Još veće zaostajanje pokazali su drajveri na Swiftu i JavaScriptu, koji su mogli obraditi tokove na razini od 5 milijuna paketa u sekundi.
Na kraju, rangiranje zatvara drajver na jeziku Python, koji je mogao obraditi svega 0.14 milijuna paketa u sekundi. Implementacija na Pythonu korištena je za procjenu brzine rada interpretera bez JIT-a i bez specifičnih optimizacija (kod je izvršen koristeći CPython 3.7 i nije bio kompatibilan s PyPy, ali se napominje da bi optimizacija struktura pohrane podataka mogla povećati performanse otprilike deset puta).
Dodatno su provedena ispitivanja kašnjenja, koja su pokazala učinkovitost međuspremnika i utjecaj sakupljača smeća. Tijekom ispitivanja mjerena je kašnjenja nakon preusmjeravanja svake paketa od strane vozača u usporedbi s točno poznatim vremenom slanja. I dalje su vozači na C i Rust jeziku bili lideri, čiji su rezultati bili gotovo neodvojivi za tok od 1 milijun paketa u sekundi (otprilike 20 µs). Vozač napisan na Go jeziku se dobro pokazao, samo malo zaostajući za liderima i održavajući razinu od 20 µs. Vozač na C# pokazao je kašnjenja od otprilike 50 µs.
Najveća kašnjenja imali su vozači na JavaScript i Java (kašnjenja veća od 300 µs).
Istraživanje je provedeno s ciljem procjene mogućnosti razvoja vozača i komponenti operativnog sustava na jezicima višeg nivoa od C. Trenutno se 39 od 40 problema pri radu s memorijom u Linuxu odnosi na vozače, stoga su pitanja primjene sigurnijeg jezika i premještanja vozača iz jezgre u korisnički prostor a proizvođači već aktivno eksperimentiraju u ovom smjeru (na primjer, Google je razvio TCP staklo za OS na Go jeziku, tvrtka CloudFlare implementaciju QUIC protokola na Rust jeziku, tvrtka Apple je premjestila TCP staklo na mobilnim uređajima u korisnički prostor).
U tijeku provedene studije došlo se do zaključka da je Rust najbolji kandidat za razvoj vozača. Mogućnosti koje Rust nudi omogućuju rješavanje problema koji nastaju zbog niskonivojnog rada s memorijom, uz trošak smanjenja performansi od otprilike 2%-10% u usporedbi s vozačima na C jeziku. Jezici Go i C# su također priznati kao prikladni za stvaranje sistemskih komponenti, u situacijama kada su prihvatljiva kašnjenja na razini dijelova milisekundi uzrokovana primjenom sakupljača smeća.
Izvor: opennet.ru
