Võrgudraiveri jõudluse võrdlus 10 programmeerimiskeele versioonides

Rühm Saksamaa ülikoolide teadlasi опубликовала järeldused katse, mille käigus töötati välja 10 gigabitiste Intel Ixgbe (X10xx) võrgukaartide standarddraiveri 5 versiooni erinevates programmeerimiskeeltes. Draiver töötab kasutajaruumis ja seda on rakendatud C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript ja Python. Koodi kirjutamisel keskenduti põhitähelepanu parima võimaliku soorituse saavutamisele, võttes arvesse iga keele iseärasusi. Kõik valikud on funktsionaalsuselt identsed ja koosnevad ligikaudu 1000 koodireast. Projektide arendused levima BSD litsentsi alusel.

Draiveri Rust-versioon osutus C-keeles võrdlusdraiveri jõudluses väga lähedaseks. Koormuse all koos 32 paketi plokkide samaaegse saatmisega jäi Rusti draiver veidi maha, kuid testides, kus ploki kohta oli rohkem kui 32 paketti, ei erinenud kiirus praktiliselt C-draiveri omast ja demonstreeris jõudlust 28 miljoni töötlemise tasemel. pakette sekundis Xeon CPU E3-1230 v2 3.3 GHz serveris.

Võrgudraiveri jõudluse võrdlus 10 programmeerimiskeele versioonides

Järgmise jõudluse niši hõivasid Go ja C# keelte draiverid, mis näitasid üsna lähedasi tulemusi (Go-draiver võitis kuni 16 paketiga plokkidega testides ja hakkas veidi kaotama rohkem kui 16 paketiga testides plokis). 256 paketiga ploki kohta oli C# draiveri maksimaalne jõudlus ligikaudu 28 miljonit paketti sekundis ja Go draiver ligikaudu 25 miljonit paketti sekundis.

Järgmiseks olid üsna tihedate tulemustega sõitjad
Java, OCaml ja Haskell, mis olid juba märgatavalt maha jäänud varem kaalutud valikutest ega suutnud ületada 12 miljonit paketti sekundis. Swifti ja JavaScripti draiverid näitasid veelgi suuremat viivitust, suutes töödelda vooge 5 miljoni paketi tasemel sekundis.

Edetabeli lõpetas Pythoni draiver, mis suutis töödelda vaid 0.14 miljonit paketti sekundis. Pythoni rakendust kasutati tõlkide kiiruse hindamiseks ilma JIT-ita ja ilma konkreetsete optimeerimisteta (kood käivitati CPython 3.7 abil ja see ei ühildu PyPy-ga, kuid tuleb märkida, et andmesalvestusstruktuuride optimeerimine võib parandada jõudlust umbes 10 korda ).

Lisaks viidi läbi latentsustestid, et näidata puhverdamise tõhusust ja prügikoguja mõju. Testimisel mõõdeti latentsust pärast iga paketi edastamist draiveri poolt, võrreldes selle saatmise täpse ajaga. Liidrid olid endiselt C- ja Rust-draiverid, mille tulemused olid 1 miljoni paketi sekundis (umbes 20 µs) voo puhul praktiliselt eristamatud. Go sõitja esines hästi, jäädes liidritest maha vaid veidi ja püsides samuti 20 µs tasemel. C# draiver näitas umbes 50 µs viivitusi.
Pikimaid viivitusi näitasid JavaScripti ja Java draiverid (latentsusaeg üle 300 µs).

Võrgudraiveri jõudluse võrdlus 10 programmeerimiskeele versioonides

Uuring viidi läbi selleks, et hinnata võimalust arendada draivereid ja operatsioonisüsteemi komponente kõrgema taseme keeltes kui C. Praegu on Linuxi mäluprobleemidest 39-st 40 seotud draiveritega, seega on probleeme turvalisema keele kasutamise ja draiverite tuumast välja kasutajaruumi teisaldamisega. jäävad asjakohaseks ja tootjad katsetavad selles suunas juba aktiivselt (näiteks Google on OS-i jaoks välja töötanud TCP-pinu Fuksia Go keeles, ettevõte CloudFlare loodud QUIC-protokolli juurutamine Rustis, on Apple teisaldanud mobiilseadmete TCP-virna kasutajaruumi).

Töö käigus jõuti järeldusele, et Rust keel on parim kandidaat juhi arendamiseks. Rooste võimalused kõrvaldavad madala taseme mäluhaldusega seotud probleemid, mille hind on võrreldes C-draiveritega ligikaudu 2–10% jõudluse kadu. Go ja C# peetakse sobivaks ka süsteemikomponentide loomiseks olukordades, kus prügikorjamisest põhjustatud submillisekundiline latentsus on aktsepteeritav.

Allikas: opennet.ru

Lisa kommentaar