Tīkla draivera veiktspējas salīdzinājums versijās 10 programmēšanas valodās

Pētnieku grupa no Vācijas universitātēm опубликовала rezultāti eksperiments, kuras laikā tika izstrādātas 10 standarta draivera versijas 10 gigabitu Intel Ixgbe (X5xx) tīkla kartēm dažādās programmēšanas valodās. Draiveris darbojas lietotāja telpā un ir ieviests C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript un Python. Rakstot kodu, galvenais uzsvars tika likts uz pēc iespējas labāku sniegumu, ņemot vērā katras valodas īpatnības. Visas opcijas ir identiskas funkcionalitātē un sastāv no aptuveni 1000 koda rindiņām. Projektu attīstība izplatīties saskaņā ar BSD licenci.

Draivera Rust versija pēc veiktspējas izrādījās ļoti tuva atsauces draiverim C valodā. Slodzes laikā ar vienlaicīgu 32 pakešu bloku nosūtīšanu Rust draiveris nedaudz atpalika, taču testos ar vairāk nekā 32 paketēm blokā ātrums praktiski neatšķīrās no C draivera un demonstrēja veiktspēju 28 miljonu apstrādes līmenī. paketes sekundē serverī ar Xeon CPU E3-1230 v2 3.3 GHz.

Tīkla draivera veiktspējas salīdzinājums versijās 10 programmēšanas valodās

Nākamo nišu veiktspējas ziņā ieņēma draiveri Go un C# valodās, kas uzrādīja diezgan tuvus rezultātus (Go draiveris uzvarēja testos ar blokiem līdz 16 paketēm un sāka nedaudz zaudēt testos ar vairāk nekā 16 paketēm blokā). Ar 256 paketēm blokā C# draivera maksimālā veiktspēja bija aptuveni 28 miljoni pakešu sekundē, un Go draivera darbība bija aptuveni 25 miljoni pakešu sekundē.

Tālāk ar diezgan ciešiem rezultātiem bija braucēji
Java, OCaml un Haskell, kas jau manāmi atpalika no iepriekš apsvērtajām iespējām un nespēja pārvarēt 12 miljonu pakešu sekundē joslu. Swift un JavaScript draiveri uzrādīja vēl lielāku nobīdi, spējot apstrādāt straumes 5 miljonu pakešu sekundē.

Augstāko vietu pabeidza Python draiveris, kas spēja apstrādāt tikai 0.14 miljonus pakešu sekundē. Python implementācija tika izmantota, lai novērtētu tulku ātrumu bez JIT un bez īpašām optimizācijām (kods tika izpildīts, izmantojot CPython 3.7 un nebija savietojams ar PyPy, taču jāatzīmē, ka datu uzglabāšanas struktūru optimizācija varētu uzlabot veiktspēju aptuveni 10 reizes ).

Turklāt tika veikti latentuma testi, lai parādītu buferizācijas efektivitāti un atkritumu savācēja ietekmi. Pārbaudē tika mērīts latentums pēc tam, kad draiveris bija pārsūtījis katru paketi, salīdzinot ar precīzu tās nosūtīšanas laiku. Līderi joprojām bija C un Rust draiveri, kuru rezultāti praktiski nebija atšķirami plūsmai 1 miljons pakešu sekundē (aptuveni 20 µs). Go braucējs uzstājās labi, tikai nedaudz atpaliekot no līderiem un arī paliekot 20 µs līmenī. C# draiveris uzrādīja aptuveni 50 µs aizkavi.
Visilgāko aizkavi uzrādīja JavaScript un Java draiveri (latencie vairāk nekā 300 µs).

Tīkla draivera veiktspējas salīdzinājums versijās 10 programmēšanas valodās

Pētījums tika veikts, lai novērtētu iespēju izstrādāt draiverus un operētājsistēmas komponentus augstāka līmeņa valodās nekā C. Pašlaik 39 no 40 Linux atmiņas problēmām ir saistītas ar draiveriem, tāpēc problēmas ar drošākas valodas izmantošanu un draiveru pārvietošanu no kodola un lietotāja vietu. paliek aktuāli un ražotāji jau aktīvi eksperimentē šajā virzienā (piemēram, Google ir izstrādājis TCP steku operētājsistēmai Fuksija Go valodā, uzņēmums CloudFlare izveidots QUIC protokola ieviešana Rust, Apple ir pārvietojis TCP steku mobilajās ierīcēs lietotāja telpā).

Darba gaitā tika secināts, ka Rust valoda ir labākā kandidāte autovadītāju attīstībai. Rust iespējas novērš problēmas, kas saistītas ar zema līmeņa atmiņas pārvaldību, par aptuveni 2% līdz 10% veiktspējas zudumu salīdzinājumā ar C draiveriem. Go un C# tiek uzskatīti par piemērotiem arī sistēmas komponentu izveidei situācijās, kad ir pieļaujams atkritumu savākšanas izraisītais latentums, kas ir mazāks par milisekundēm.

Avots: opennet.ru

Pievieno komentāru