Krahasimi i performancës së shoferëve të rrjetit në 10 gjuhë programimi

Një grup kërkuesish nga universitetet gjermane publikoi rezultatet eksperimentit, gjatë të cilit 10 variante të një shoferi tipik për kartat rrjetore 10-gigabit Intel Ixgbe (X5xx) u zhvilluan në gjuhë të ndryshme programimi. Shoferi operon në hapësirën e përdoruesit dhe është realizuar në gjuhët C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript dhe Python. Gjatë shkruarjes së kodit, theksi kryesor ishte arritja e performancës maksimale të mundshme duke marrë parasysh veçoritë e çdo gjuhe. Sa i përket funksionalitetit, të gjitha variantet janë identike dhe përbëhen prej rreth 1000 linjash kodi. Projeksionet e projektit distribuohen në bazë të licencës BSD.

Varianti i shoferit në gjuhën Rust rezultoi të ishte shumë i afërt me performancën e shoferit referencë në gjuhën C. Me një ngarkesë të dërgimit të blloqeve prej 32 paketash në të njëjtën kohë, shoferi Rust paksa priste, por në testet me më shumë se 32 paketa në bllok, shpejtësia pothuajse nuk ndryshonte nga shoferi në C dhe demonstroi performancë në niveli të përpunimit të 28 milion paketimeve në sekondë në një server me CPU Xeon E3-1230 v2 3.3 GHz.

Krahasimi i performancës së shoferëve të rrjetit në 10 gjuhë programimi

Nishën e ardhshme në performancë e zënë shoferët në gjuhët Go dhe C#, të cilat treguan rezultate mjaft të afërta (shoferi në Go fitonte në testet me blloqe që përmbanin deri në 16 paketa dhe filloi të humbasë në testet me më shumë se 16 paketa në bllok). Me 256 paketa në bllok, performanca maksimale e shoferit në C# ishte rreth 28 milion paketash në sekondë, ndërsa shoferi në Go ishte rreth 25 milion paketash në sekondë.

Më tej, me rezultate mjaft të afërta, erdhën shoferët në
Java, OCaml dhe Haskell, të cilat tashmë mbeteshin dukshëm pas varianteve të mëparshme dhe nuk arritën të kalonin kufirin prej 12 milion paketash në sekondë. Edhe më shumë të pranishme ishin shoferët në Swift dhe JavaScript, të cilët arritën të përpunonin rrjedhjet në nivele prej 5 milion paketash në sekondë.

Shoferi në gjuhën Python e mbylli renditjen, duke arritur të përpunonte vetëm 0.14 milion paketash në sekondë. Realizimi në Python u përdor për të vlerësuar shpejtësinë e punës së interpretimeve pa JIT dhe pa optimizime specifike (kodi u ekzekutua duke përdorur CPython 3.7 dhe nuk ishte në përputhje me PyPy, por gjithashtu vërehet se optimizimi i strukturave të ruajtjes së të dhënave mund të rrisë performancën rreth 10 herë).

Shtesë, janë bërë teste për kohën e vonesës, të cilat treguan efikasitetin e buffer-it dhe ndikimin e mbledhësit të plehrave. Gjatë testimit u mat vonesa pas ridrejtimit të çdo paketi nga drejtuesi krahas një kohe të njohur saktësisht të dërgimit. Sërish, drejtuesit në C dhe Rust ishin liderë, me rezultate thuajse të padallueshme për një rrjedhë prej 1 milion paketash në sekondë (rreth 20 µs). Drejtuesi në Go gjithashtu tregoi performancë të mirë, duke mbetur pak pas liderëve dhe duke u mbajtur në nivelin e 20 µs. Drejtuesi në C# tregoi vonesa prej rreth 50 µs.
Drejtuesit në JavaScript dhe Java treguan vonesat më të mëdha (më shumë se 300 µs).

Krahasimi i performancës së shoferëve të rrjetit në 10 gjuhë programimi

Studimi është realizuar me qëllim të vlerësimit të mundësisë për zhvillimin e drejtuesve dhe komponenteve të sistemit operativ në gjuhë më të shkurtra se C. Aktualisht, 39 nga 40 problemet midis nivelit të memories në Linux janë të lidhura me drejtuesit, prandaj çështjet e përdorimit të një gjuhe më të sigurt dhe të nxjerrjes së drejtuesve nga bërthama në hapësirën e përdoruesit mbeten aktuale dhe prodhuesit tashmë janë duke eksperimentuar aktivisht në këtë drejtim (për shembull, Google ka zhvilluar një grup TCP për OS Fuchsia në gjuhën Go, kompania CloudFlare krijoi një implementim të protokollit QUIC në gjuhën Rust, kompania Apple ka transferuar grupin TCP në pajisjet mobile në hapësirën e përdoruesit).

Gjatë punës së bërë është arritur në përfundimin se gjuhë Rust është kandidati më i mirë për zhvillimin e drejtuesve. Mundësitë e ofruara në Rust lejojnë eliminimin e problemeve që lindin nga puna me nivel të ulët me memorien, me një çmim të uljes së performancës prej rreth 2%-10% krahasuar me drejtuesit në gjuhën C. Gjuhët Go dhe C# gjithashtu janë njohur si të përshtatshme për krijimin e komponenteve sistemore, në situatat kur vonesat në nivelin e ndarjeve të milisekondës janë të pranueshme për shkak të përdorimit të mbledhësit të plehrave.

Burimi: opennet.ru

Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы 🔥 Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы | ProHoster