Een groep onderzoekers van Duitse universiteiten de resultaten , waarbij in verschillende programmeertalen 10 versies van een standaardstuurprogramma voor 10-gigabit netwerkaarten van Intel Ixgbe (X5xx) zijn ontwikkeld. Het stuurprogramma werkt in de gebruikersruimte en is geĆÆmplementeerd in de talen C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript en Python. Bij het schrijven van de code lag de nadruk op het bereiken van de maximaal mogelijke prestaties rekening houdend met de kenmerken van elke taal. Wat functionaliteit betreft zijn alle versies identiek en bestaan ze uit ongeveer 1000 regels code. De resultaten van het project onder de BSD-licentie.
De Rust-versie van het stuurprogramma bleek qua prestaties zeer dicht bij het referentiestuurprogramma in C te liggen. Bij een belasting met gelijktijdige verzending van blokken van 32 pakketten bleef de Rust-stuurprogramma iets achter, maar in tests met meer dan 32 pakketten in een blok vertoonde het vrijwel geen verschillen in snelheid ten opzichte van het stuurprogramma in C en behaalde het een verwerkingssnelheid van 28 miljoen pakketten per seconde op een server met een CPU Xeon E3-1230 v2 3.3 GHz.
De volgende plaats qua prestaties werd ingenomen door de stuurprogramma's in de talen Go en C#, die voldoende vergelijkbare resultaten lieten zien (de stuurprogramma in Go was beter in tests met blokken van maximaal 16 pakketten, maar verloor iets in tests met meer dan 16 pakketten in een blok). Bij 256 pakketten in een blok bedroeg de piekprestatie van het stuurprogramma in C# ongeveer 28 miljoen pakketten per seconde, terwijl het stuurprogramma in Go ongeveer 25 miljoen pakketten per seconde behaalde.
Daarna volgden met voldoende vergelijkbare resultaten de stuurprogramma's in
Java, OCaml en Haskell, die al merkbaar achterbleven bij de eerder behandelde versies en niet in staat waren de grens van 12 miljoen pakketten per seconde te overschrijden. Een nog grotere achterstand vertoonden de stuurprogramma's in Swift en JavaScript, die slechts stromen konden verwerken op het niveau van 5 miljoen pakketten per seconde.
De ranglijst werd afgesloten door het stuurprogramma in Python, dat slechts 0,14 miljoen pakketten per seconde kon verwerken. De implementatie in Python werd gebruikt om de snelheid van de interpreters zonder JIT en zonder specifieke optimalisaties te evalueren (de code werd uitgevoerd met CPython 3.7 en was niet compatibel met PyPy, maar het wordt opgemerkt dat optimalisatie van gegevensstructuren de prestaties ongeveer 10 keer zou kunnen verhogen).
Daarnaast zijn er tests uitgevoerd op latentie, die de effectiviteit van buffering en de impact van de garbage collector toonden. Tijdens de tests werd de latentie gemeten na de herverdeling van elk pakket door de driver in vergelijking met de nauwkeurig bekende verzendtijd. De leiders bleven de drivers in C en Rust, waarvan de resultaten praktisch niet te onderscheiden waren voor een stroom van 1 miljoen pakketten per seconde (ongeveer 20 µs). De driver in de programmeertaal Go presteerde ook goed en bleef slechts iets achter bij de leiders, met een latentie van ook rond de 20 µs. De driver in C# vertoonde latenties van ongeveer 50 µs.
De grootste latenties werden gemeten bij de drivers in JavaScript en Java (latenties van meer dan 300 µs).
Het onderzoek is uitgevoerd met als doel de mogelijkheden te beoordelen voor de ontwikkeling van drivers en besturingssysteemcomponenten in hogere programmeertalen dan C. Momenteel zijn 39 van de 40 geheugenproblemen in Linux gerelateerd aan drivers, daarom blijven de vragen over het gebruik van een veiliger taal en het verplaatsen van drivers uit de kernel naar de gebruikersruimte en fabrikanten experimenteren al actief in deze richting (bijvoorbeeld, Google heeft een TCP-stack voor het besturingssysteem in de programmeertaal Go ontwikkeld, en CloudFlare een implementatie van het QUIC-protocol in de programmeertaal Rust gemaakt, en Apple heeft de TCP-stack op mobiele apparaten naar de gebruikersruimte verplaatst).
Tijdens het uitgevoerde werk is geconcludeerd dat de programmeertaal Rust de beste kandidaat is voor de ontwikkeling van drivers. De mogelijkheden die Rust biedt, maken het mogelijk om problemen die voortkomen uit laag-niveau geheugenbeheer te vermijden, ten koste van een prestatievermindering van ongeveer 2%-10% in vergelijking met drivers in de programmeertaal C. De programmeertalen Go en C# worden ook als geschikt beschouwd voor het creƫren van systeemcomponenten, in situaties waar latenties op het niveau van enkele milliseconden acceptabel zijn, veroorzaakt door het gebruik van garbage collection.
Bron: opennet.ru
