Krahasimi i performancës së drejtuesve të rrjetit në versionet në 10 gjuhë programimi

Një grup studiuesish nga universitetet gjermane botuar rezultatet eksperimenta, gjatë së cilës u zhvilluan 10 versione të një drejtuesi standard për kartat e rrjetit Intel Ixgbe (X10xx) 5 gigabitësh në gjuhë të ndryshme programimi. Drejtuesi funksionon në hapësirën e përdoruesit dhe zbatohet në C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript dhe Python. Gjatë shkrimit të kodit, fokusi kryesor ishte në arritjen e performancës më të mirë të mundshme, duke marrë parasysh karakteristikat e secilës gjuhë. Të gjitha opsionet janë identike në funksionalitet dhe përbëhen nga afërsisht 1000 rreshta kodi. Zhvillimet e projektit përhapet nën licencën BSD.

Versioni Rust i drejtuesit doli të ishte shumë afër performancës me drejtuesin e referencës në gjuhën C. Nën një ngarkesë me dërgimin e njëkohshëm të blloqeve prej 32 paketash, drejtuesi Rust ishte pak prapa, por në testet me më shumë se 32 pako për bllok, shpejtësia praktikisht nuk ishte e ndryshme nga drejtuesi C dhe tregoi performancë në nivelin e përpunimit 28 milion. pako për sekondë në një server me një CPU Xeon E3-1230 v2 3.3 GHz.

Krahasimi i performancës së drejtuesve të rrjetit në versionet në 10 gjuhë programimi

Nishja tjetër për sa i përket performancës u pushtua nga drejtuesit në gjuhët Go dhe C#, të cilët treguan rezultate mjaft të afërta (shoferi Go fitoi në teste me blloqe deri në 16 paketa dhe filloi të humbasë pak në testet me më shumë se 16 pako në një bllok). Me 256 pako për bllok, performanca maksimale e drejtuesit C# ishte afërsisht 28 milionë pako për sekondë, dhe drejtuesi Go ishte afërsisht 25 milionë pako për sekondë.

Tjetra, me rezultate mjaft të afërta, ishin drejtuesit për
Java, OCaml dhe Haskell, të cilat tashmë ishin dukshëm prapa opsioneve të konsideruara më parë dhe nuk mund të kapërcenin shiritin prej 12 milionë pako për sekondë. Drejtuesit e Swift dhe JavaScript treguan një vonesë edhe më të madhe, duke qenë në gjendje të përpunonin transmetime në nivelin e 5 milionë paketave në sekondë.

Renditja më e lartë u plotësua nga shoferi Python, i cili ishte në gjendje të përpunonte vetëm 0.14 milionë pako në sekondë. Implementimi i Python u përdor për të vlerësuar shpejtësinë e interpretuesve pa JIT dhe pa optimizime specifike (kodi u ekzekutua duke përdorur CPython 3.7 dhe nuk ishte në përputhje me PyPy, por vihet re se optimizimi i strukturave të ruajtjes së të dhënave mund të përmirësonte performancën me rreth 10 herë ).

Për më tepër, testet e vonesës u kryen për të treguar efektivitetin e bufferimit dhe ndikimin e grumbulluesit të plehrave. Testimi mati vonesën pas përcjelljes së secilës paketë nga drejtuesi në krahasim me kohën e saktë që u dërgua. Udhëheqësit ishin ende drejtuesit C dhe Rust, rezultatet e të cilave praktikisht ishin të padallueshme për një rrjedhë prej 1 milion pako në sekondë (afërsisht 20 µs). Shoferi Go performoi mirë, duke qenë vetëm pak prapa liderëve dhe gjithashtu duke mbetur në nivelin e 20 µs. Drejtuesi C# tregoi vonesa prej afërsisht 50 µs.
Vonesat më të gjata u shfaqën nga drejtuesit e JavaScript dhe Java (vonesa prej më shumë se 300 µs).

Krahasimi i performancës së drejtuesve të rrjetit në versionet në 10 gjuhë programimi

Studimi u krye për të vlerësuar mundësinë e zhvillimit të drejtuesve dhe komponentëve të sistemit operativ në gjuhë të nivelit më të lartë se C. Aktualisht, 39 nga 40 problemet e memories në Linux janë të lidhura me drejtuesit, kështu që problemet e përdorimit të një gjuhe më të sigurt dhe zhvendosjes së drejtuesve jashtë kernelit dhe në hapësirën e përdoruesit mbeten relevante dhe prodhuesit tashmë po eksperimentojnë në mënyrë aktive në këtë drejtim (për shembull, Google ka zhvilluar një grumbull TCP për sistemin operativ Fuchsia në gjuhën Go, kompania CloudFlare krijuar implementimi i protokollit QUIC në Rust, Apple ka zhvendosur grupin TCP në pajisjet celulare në hapësirën e përdoruesit).

Gjatë punës, u arrit në përfundimin se gjuha Rust është kandidati më i mirë për zhvillimin e shoferit. Aftësitë e Rust eliminojnë problemet që lidhen me menaxhimin e memories së nivelit të ulët me koston e rreth 2% deri në 10% humbje të performancës në krahasim me drejtuesit C. Go dhe C# konsiderohen gjithashtu të përshtatshme për krijimin e komponentëve të sistemit në situata ku vonesa nën milisekonda e shkaktuar nga mbledhja e mbeturinave është e pranueshme.

Burimi: opennet.ru

Shto një koment