Võrgu draiveri jõudluse võrdlus 10 programmeerimiskeele variandis

Saksa ülikoolide teadlaste grupp avalikustasin tulemused katse, mille käigus töötati välja 10 tüüpilise draiveri varianti 10-gigabitiste Intel Ixgbe (X5xx) võrgukaartide jaoks erinevates programmeerimiskeeltes. Draiver töötab kasutajaruumi tasandil ja on kirjutatud keeltes C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript ja Python. Koodi kirjutamisel pöörati erilist tähelepanu maksimaalse jõudluse saavutamisele, arvestades iga keele eripära. Funktsionaalselt on kõik variandid identsed ja koosnevad ligikaudu 1000 rea koodist. Projekti tulemused jaotatakse BSD litsentsi alusel.

Rust keeles kirjutatud draiveri variant osutus jõudluse poolest väga lähedaseks C keeles kirjutatud standarddraiverile. Kui testiti 32 pakendi saatmise koormust, jäi Rust-draiver veidi maha, kuid testides, kus oli üle 32 pakendi bloki kohta, ei erinenud see kiiruselt peaaegu üldse C draiverist ning näitas jõudlust 28 miljoni paketi töötlemisel sekundis Xeon E3-1230 v2 3.3 GHz protsessoriga serveris.

Võrgu draiveri jõudluse võrdlus 10 programmeerimiskeele variandis

Järjestuse järgmine nišš jõudluses hõivasid Go ja C# keele draiverid, mis näitasid piisavalt sarnaseid tulemusi (Go draiver võitis testides, kus oli kuni 16 paketti, ja hakkas veidi kaotama testides, kus oli rohkem kui 16 paketti plokis). 256 paketiga plokis oli C# draiveri tipp jõudlus umbes 28 miljonit paketti sekundis, samas kui Go draiveri tipp oli umbes 25 miljonit paketti sekundis.

Järgmise sarnaste tulemustega järgnesid draiverid
Java, OCaml ja Haskell, mis jäid juba märgatavalt maha varem käsitletud variantidest ja ei suutnud ületada 12 miljoni paketi piiri sekundis. Veelgi suuremat maha jäämist näitasid Swift ja JavaScript draiverid, mis suutsid töödelda vooge tasemel 5 miljonit paketti sekundis.

Pythonis loodud draiver testis, mis suutis töödelda vaid 0.14 miljonit paketti sekundis. Pythoni teostust kasutati tõlgendite töökiirusete hindamiseks JIT-ita ja ilma spetsiifiliste optimeeringuteta (kood jooksis CPython 3.7 peal ja ei olnud ühilduv PyPy-ga, kuid märgitakse, et andmestruktuuride optimeerimine võiks tõsta jõudlust umbes 10 korda).

Samuti viidi läbi viivituse testid, mis näitasid vahemälustamise efektiivsust ja prügikoristaja mõju. Testimise käigus mõõdeti viivitus pärast iga paketi suunamist draiveri poolt võrreldes täpselt tuntud saatmisajaga. Liidriteks jäid endiselt C ja Rust draiverid, mille tulemused olid praktiliselt eristamatud 1 miljoni paketi sekundis voo puhul (umbes 20 µs). Go keeles kirjutatud draiveri tulemus oli samuti hea, jäädes liidritest vaid veidi maha ja püsides 20 µs tasemel. C# draiver näitas viivitusid umbes 50 µs.
Kõige suuremad viivitused näitasid JavaScripti ja Java draiverid (viivitused üle 300 µs).

Võrgu draiveri jõudluse võrdlus 10 programmeerimiskeele variandis

Uuringu eesmärk oli hinnata võimalusi arendada draivereid ja operatsioonisüsteemi komponente kõrgema taseme keeltes kui C. Praegu on 39-st 40-st mäluga seotud probleemist Linuxis seotud draiveritega, seega on küsimused turvalisema keele kasutamise ja draiverite viimise tuumast kasutaja ruumi edasi lükkunud ning tootjad katsetavad aktiivselt selles suunas (näiteks on Google välja töötanud TCP-steki OS-ile Fuchsia keeles Go, ettevõte CloudFlare loobis rakenduse protokolli QUIC keeles Rust, ettevõte Apple on toonud TCP-steki mobiilseadmetes kasutaja ruumi).

Töödeldud teabe põhjal võib järeldada, et Rust on parim kandidaat draiverite väljatöötamiseks. Rusti pakutavad võimalused võimaldavad kõrvaldada probleemid, mis tulenevad madala taseme mälu käsitsemisest, andes juurde umbes 2%-10% jõudluse languse võrreldes C keeles kirjutatud draiveritega. Ka Go ja C# on tunnustatud sobilikena süsteemikomponentide loomiseks, kui on vastuvõetavad viivitused millisekundite osas, mis on põhjustatud prügifunktsiooni kasutamisest.

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster