Német egyetemek kutatócsoportja eredmények , amelynek során különböző programozási nyelveken 10 változat készült az Intel Ixgbe (X5xx) 10 gigabites hálózati kártyák szabványos illesztőprogramjából. Az illesztőprogram felhasználói térben működik, és C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript és Python nyelveken van megvalósítva. A kód írásakor a fő figyelmet a lehető legnagyobb teljesítmény elérésére fordították, figyelembe véve minden nyelv sajátosságait. Funkcionalitás szempontjából mindegyik változat azonos, és körülbelül 1000 sor kódból áll. A projekt eredményei BSD licenc alatt.
A Rust nyelvű illesztőprogram teljesítménye nagyon közel állt a referencia illesztőprograméhoz, amely C nyelven készült. 32 csomag egyidejű küldésével a Rust-illesztőprogram kicsit lemaradt, de több mint 32 csomaggal végzett tesztekben gyakorlatilag nem tért el a C nyelvű illesztőprogramtól, és körülbelül 28 millió csomag másodpercenkénti feldolgozási sebességet mutatott egy Xeon E3-1230 v2 3,3 GHz-es CPU-szerver esetében.
A következő teljesítménybeli részesedést a Go és C# nyelveken készült illesztőprogramok érték el, amelyek elég közeli eredményeket mutattak (a Go illesztőprogram a 16 csomagig terjedő blokkok tesztjeiben nyert, majd kicsit vesztett a 16 csomagnál nagyobb blokkok tesztjeiben). 256 csomag blokkjában a C# illesztőprogram csúcs teljesítménye körülbelül 28 millió csomag másodpercenként volt, míg a Go illesztőprogram körülbelül 25 millió csomagot másodpercenként.
Ezt követően, szintén elég közeli eredményekkel,
Java, OCaml és Haskell illesztőprogramok következtek, amelyek már jelentősen lemaradtak az előbbiekhez képest, és nem tudták átlépni a 12 millió csomag másodpercenkénti szintet. Még nagyobb lemaradást mutattak a Swift és JavaScript illesztőprogramok, amelyek körülbelül 5 millió csomag másodpercenkénti sebességgel bírták a forgalmat.
A rangsort a Python nyelvű illesztőprogram zárta, amely mindössze 0,14 millió csomagot tudott feldolgozni másodpercenként. A Python megvalósítást a JIT nélküli és specifikus optimalizációk nélküli értelmezők sebességének értékelésére használták (a kódot CPython 3.7-tel futtatták, és nem volt kompatibilis a PyPy-val, de megjegyzendő, hogy az adatszerkezetek optimalizálása körülbelül 10-szeres teljesítménynövekedést érhetne el).
További teszteket végeztek a késleltetési időről, amelyek megmutatták a gyorsítótárazás hatékonyságát és a szemétgyűjtő hatását. A tesztelés során a késleltetést mérték, miután a meghajtó minden csomagot átirányított, összehasonlítva a pontosan ismert küldési idővel. A vezetők továbbra is a C és Rust driverei lettek, amelyek eredményei gyakorlatilag megkülönböztethetetlenek voltak 1 millió csomag másodpercenként (kb. 20 µs). A Go nyelvű meghajtó is jól teljesített, csupán egy kicsit lemaradva a vezetőktől, szintén 20 µs körüli értékkel. A C# meghajtó körülbelül 50 µs késleltetést mutatott.
A legnagyobb késleltetéseket a JavaScript és Java driverei mutatták (késleltetések 300 µs felett).
A kutatást azzal a céllal végezték, hogy értékeljék a driverek és operációs rendszer összetevők fejlesztésének lehetőségét magasabb szintű nyelveken, mint a C. Jelenleg 39-ből 40 memóriahasználati probléma a Linuxban a driverekhez köthető, ezért a biztonságosabb nyelv alkalmazásának kérdése és a driverek felhelyezése a magból a felhasználói térbe és a gyártók már aktívan kísérleteznek ebben az irányban (például a Google TCP-stackot fejlesztett a Go nyelven, a CloudFlare rust nyelven valósította meg a QUIC protokollt, az Apple pedig áthelyezte a TCP-stackot a mobil eszközök felhasználói terébe).
A végzett munka során arra a következtetésre jutottunk, hogy a Rust nyelv a legjobb jelölt driverek fejlesztésére. A Rust által biztosított lehetőségek segítségével megszabadulhatunk a memóriakezelés alacsony szintű működéséből adódó problémáktól, cserébe körülbelül 2%-10%-os teljesítménycsökkenést szenved el a C nyelvű driverekhez képest. A Go és a C# nyelvek szintén alkalmasak rendszerszintű összetevők létrehozására, olyan helyzetekben, amikor a szemétgyűjtő alkalmazása miatti késleltetések a milliszekundum töredékére elfogadhatók.
Forrás: opennet.ru
