Paghahambing ng pagganap ng driver ng network sa mga bersyon sa 10 programming language

Isang pangkat ng mga mananaliksik mula sa mga unibersidad ng Aleman ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° ang mga resulta eksperimento, kung saan binuo ang 10 bersyon ng karaniwang driver para sa 10-gigabit Intel Ixgbe (X5xx) network card sa iba't ibang programming language. Ang driver ay tumatakbo sa espasyo ng gumagamit at ipinatupad sa C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript at Python. Kapag nagsusulat ng code, ang pangunahing pokus ay sa pagkamit ng pinakamahusay na posibleng pagganap, na isinasaalang-alang ang mga katangian ng bawat wika. Ang lahat ng mga opsyon ay magkapareho sa functionality at binubuo ng humigit-kumulang 1000 linya ng code. Mga pag-unlad ng proyekto kumalat sa ilalim ng lisensya ng BSD.

Ang Rust na bersyon ng driver ay naging napakalapit sa pagganap sa reference na driver sa wikang C. Sa ilalim ng isang load na may sabay-sabay na pagpapadala ng mga bloke ng 32 packet, ang Rust driver ay bahagyang nasa likod, ngunit sa mga pagsubok na may higit sa 32 packet bawat bloke, ang bilis ay halos hindi naiiba mula sa C driver at nagpakita ng pagganap sa antas ng pagproseso ng 28 milyon mga packet bawat segundo sa isang server na may Xeon CPU E3-1230 v2 3.3 GHz.

Paghahambing ng pagganap ng driver ng network sa mga bersyon sa 10 programming language

Ang susunod na angkop na lugar sa mga tuntunin ng pagganap ay inookupahan ng mga driver sa Go at C# na mga wika, na nagpakita ng medyo malapit na mga resulta (ang Go driver ay nanalo sa mga pagsubok na may mga bloke na hanggang 16 na packet, at nagsimulang bahagyang mawala sa mga pagsubok na may higit sa 16 na packet sa isang bloke). Sa 256 na packet bawat bloke, ang pinakamataas na pagganap ng C# driver ay humigit-kumulang 28 milyong packet bawat segundo, at ang Go driver ay humigit-kumulang 25 milyong packet bawat segundo.

Susunod, na may medyo malapit na mga resulta, ay ang mga driver para sa
Java, OCaml at Haskell, na kapansin-pansing nahuhuli sa mga naunang isinasaalang-alang na mga opsyon at hindi madaig ang 12 milyong packet bawat segundong bar. Ang mga driver ng Swift at JavaScript ay nagpakita ng mas malaking lag, na nakapagproseso ng mga stream sa antas na 5 milyong packet bawat segundo.

Ang nangungunang ranggo ay nakumpleto ng driver ng Python, na nakapagproseso lamang ng 0.14 milyong packet bawat segundo. Ang pagpapatupad ng Python ay ginamit upang suriin ang bilis ng mga interpreter nang walang JIT at walang mga partikular na pag-optimize (ang code ay naisakatuparan gamit ang CPython 3.7 at hindi tugma sa PyPy, ngunit nabanggit na ang pag-optimize ng mga istruktura ng pag-iimbak ng data ay maaaring mapabuti ang pagganap ng humigit-kumulang 10 beses ).

Bukod pa rito, isinagawa ang mga latency test upang ipakita ang pagiging epektibo ng buffering at ang epekto ng basurero. Sinukat ng pagsubok ang latency pagkatapos maipasa ng driver ang bawat packet kumpara sa eksaktong oras na ipinadala ito. Ang mga pinuno ay ang mga driver pa rin ng C at Rust, ang mga resulta nito ay halos hindi matukoy para sa daloy ng 1 milyong packet bawat segundo (humigit-kumulang 20 Β΅s). Ang driver ng Go ay gumanap nang maayos, na bahagyang nasa likod ng mga pinuno at nananatili rin sa antas na 20 Β΅s. Ang driver ng C# ay nagpakita ng mga pagkaantala ng humigit-kumulang 50 Β΅s.
Ang pinakamahabang pagkaantala ay ipinakita ng mga driver ng JavaScript at Java (mga latency na higit sa 300 Β΅s).

Paghahambing ng pagganap ng driver ng network sa mga bersyon sa 10 programming language

Ang pag-aaral ay isinagawa upang masuri ang posibilidad ng pagbuo ng mga driver at mga bahagi ng operating system sa mas mataas na antas ng mga wika kaysa sa C. Sa kasalukuyan, 39 sa 40 mga problema sa memorya sa Linux ay nauugnay sa mga driver, kaya ang mga isyu sa paggamit ng isang mas secure na wika at paglipat ng mga driver mula sa kernel at papunta sa espasyo ng gumagamit manatiling may kaugnayan at ang mga tagagawa ay aktibong nag-eeksperimento sa direksyong ito (halimbawa, nakabuo ang Google ng TCP stack para sa OS Pusiya sa wikang Go, kumpanya ng CloudFlare nilikha pagpapatupad ng QUIC protocol sa Rust, inilipat ng Apple ang TCP stack sa mga mobile device sa espasyo ng gumagamit).

Sa kurso ng trabaho, napagpasyahan na ang Rust na wika ay ang pinakamahusay na kandidato para sa pag-unlad ng driver. Tinatanggal ng mga kakayahan ng Rust ang mga problemang nauugnay sa mababang antas ng pamamahala ng memorya sa halagang humigit-kumulang 2% hanggang 10% na pagkawala ng pagganap kumpara sa mga driver ng C. Itinuturing ding angkop ang Go at C# para sa paggawa ng mga bahagi ng system sa mga sitwasyon kung saan tinatanggap ang sub-millisecond latency na dulot ng pangongolekta ng basura.

Pinagmulan: opennet.ru

Magdagdag ng komento