En gruppe forskere fra tyske universiteter resultater , hvor der blev udviklet 10 versioner af en standarddriver til 10-gigabit netværkskort Intel Ixgbe (X5xx) på forskellige programmeringssprog. Driveren arbejder i brugerrum og er implementeret i sprog som C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript og Python. Ved kodning blev der lagt særlig vægt på at opnå den bedst mulige ydeevne under hensyntagen til karakteristikaene ved hvert sprog. Funktionelt er alle versioner identiske og består af cirka 1000 linjer kode. Projektets resultater under BSD-licensen.
Driveren på Rust-sprog viste sig at være meget tæt på ydeevnen af reference-driveren på C. Under belastningen med samtidig afsendelse af blokke med 32 pakker var Rust-driveren lidt langsommere, men i tests med mere end 32 pakker i blokken var hastigheden næsten identisk med C-driveren og viste en ydeevne på niveau med 28 millioner pakker per sekund på en server med CPU Xeon E3-1230 v2 3,3 GHz.
Næste plads i ydeevne blev indtaget af driverne på Go og C#, som viste relativt nærtstående resultater (driveren på Go vandt i tests med blokke, der omfattede op til 16 pakker, og mistede lidt i tests med mere end 16 pakker i blokke). Ved 256 pakker i blokken var den maksimale ydeevne for C# driveren cirka 28 millioner pakker per sekund, mens driveren på Go nåede cirka 25 millioner pakker per sekund.
Derefter fulgte drivere på
Java, OCaml og Haskell, som allerede var betydeligt bagud i forhold til de tidligere nævnte versioner og ikke kunne overkomme grænsen på 12 millioner pakker per sekund. Endnu større efterslæb viste driverne på Swift og JavaScript, som kun kunne håndtere strømme på niveau med 5 millioner pakker per sekund.
I bunden af ranglisten lå driveren i Python, som kun kunne håndtere 0,14 millioner pakker per sekund. Implementeringen i Python blev brugt til at vurdere hastigheden af fortolkerne uden JIT og uden specifikke optimeringer (koden blev udført ved hjælp af CPython 3.7 og var ikke kompatibel med PyPy, men det bemærkes, at optimering af dataopbevaringsstrukturer kunne øge ydeevnen med cirka 10 gange).
Derudover blev der udført tests af latenstid, som viste effektiviteten af buffering og indflydelsen fra garbage collection. Under testene blev latenstiden målt efter omdirigering af hver pakke af driveren sammenlignet med det nøjagtigt kendte tidspunkt for afsendelse. Fortsat var driverne skrevet i C og Rust førende, hvis resultater praktisk talt var uadskillelige for en strøm på 1 million pakker i sekundet (ca. 20 µs). Driveren skrevet i Go klarede sig også godt, kun lidt bagefter lederne og lå også på niveauet 20 µs. Driveren i C# viste latenstider omkring 50 µs.
De største latenstider blev vist af driverne i JavaScript og Java (latenstider over 300 µs).
Undersøgelsen blev gennemført for at vurdere muligheden for at udvikle drivere og operativsystemkomponenter på højere niveau sprog end C. I øjeblikket kommer 39 ud af 40 problemer med hukommelse i Linux fra drivere, så spørgsmålene om at bruge et mere sikkert sprog og at flytte drivere ud af kernen til brugerområdet og producenter eksperimenterer allerede aktivt i denne retning (f.eks. har Google udviklet en TCP-stak til OS på Go-sprog, CloudFlare implementeringen af QUIC-protokollen på Rust-sprog, og Apple har flyttet TCP-stakken til mobile enheder ind i brugerområdet).
Gennem det udførte arbejde konkluderes det, at Rust-sprog er den bedste kandidat til udvikling af drivere. De mulighed, som Rust tilbyder, gør det muligt at undgå problemer, der opstår ved lavniveau hukommelseshåndtering, med en pris på et ydelsesfald på ca. 2%-10% sammenlignet med drivere skrevet i C. Sprogene Go og C# er også anerkendt som egnede til at oprette systemkomponenter, i situationer hvor forsinkelser på niveauet brøkdelen af et millisekund, forårsaget af brugen af garbage collection, er acceptable.
Kilde: opennet.ru
