10 програмчлалын хэл дээрх хувилбаруудын сүлжээний драйверын гүйцэтгэлийн харьцуулалт

Германы их дээд сургуулиудын хэсэг судлаачид Нийтлэгдсэн Үр дүн туршилта, энэ хугацаанд 10 гигабит Intel Ixgbe (X10xx) сүлжээний картуудад зориулсан стандарт драйверын 5 хувилбарыг өөр өөр програмчлалын хэл дээр боловсруулсан. Драйвер нь хэрэглэгчийн орон зайд ажилладаг бөгөөд C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript болон Python дээр хэрэгждэг. Код бичихдээ хэл бүрийн онцлогийг харгалзан хамгийн сайн гүйцэтгэлд хүрэхэд гол анхаарлаа хандуулсан. Бүх сонголтууд нь үйл ажиллагааны хувьд ижил бөгөөд ойролцоогоор 1000 мөр кодоос бүрдэнэ. Төслийн хөгжүүлэлт тархалт BSD лицензийн дагуу.

Драйверын Rust хувилбар нь Си хэл дээрх лавлах драйвертай гүйцэтгэлийн хувьд маш ойрхон болсон. 32 пакетын блокуудыг нэгэн зэрэг илгээх ачааллын дор Rust драйвер бага зэрэг хоцорсон боловч блок бүрт 32-аас дээш пакеттай туршилтын явцад хурд нь C драйвераас бараг ялгаагүй бөгөөд 28 сая боловсруулах түвшинд гүйцэтгэлийг харуулсан. Xeon CPU E3-1230 v2 3.3 GHz бүхий сервер дээр секундэд пакет.

10 програмчлалын хэл дээрх хувилбаруудын сүлжээний драйверын гүйцэтгэлийн харьцуулалт

Гүйцэтгэлийн хувьд дараагийн байрыг Go болон C# хэл дээрх драйверууд эзэлж байсан бөгөөд энэ нь нэлээн ойролцоо үр дүнг харуулсан (Go драйвер нь 16 хүртэлх пакеттай тестүүдэд ялсан бөгөөд 16-аас дээш пакеттай туршилтуудад бага зэрэг алдаж эхэлсэн. блок дотор). Нэг блок тутамд 256 пакеттай бол C# драйверын хамгийн дээд гүйцэтгэл нь секундэд ойролцоогоор 28 сая пакет, Go драйвер нь секундэд ойролцоогоор 25 сая пакет байв.

Дараа нь нэлээн ойролцоо үр дүнд хүрсэн жолооч нар байв
Java, OCaml болон Haskell нь өмнө нь авч үзсэн сонголтуудаас мэдэгдэхүйц хоцорч байсан бөгөөд секундэд 12 сая пакетыг даван туулж чадаагүй юм. Swift болон JavaScript драйверууд нь секундэд 5 сая пакетын урсгалыг боловсруулах чадвартай байснаас илүү их хоцролттой байсан.

Дээд зэрэглэлийг секундэд ердөө 0.14 сая пакет боловсруулах чадвартай Python драйвер гүйцэтгэсэн. Python-ийн хэрэгжилтийг JIT-гүй, тодорхой оновчлолгүйгээр орчуулагчдын хурдыг үнэлэхэд ашигласан (код нь CPython 3.7 ашиглан хийгдсэн бөгөөд PyPy-тэй нийцэхгүй байсан боловч өгөгдөл хадгалах бүтцийг оновчлох нь гүйцэтгэлийг 10 дахин нэмэгдүүлэх боломжтой гэдгийг тэмдэглэжээ. ).

Нэмж дурдахад буфержуулалтын үр нөлөө, хог цуглуулагчийн нөлөөллийг харуулахын тулд хоцрогдлын туршилтыг хийсэн. Туршилт нь жолооч илгээсэн багц бүрийг илгээсэн цагтай нь харьцуулсны дараа хоцролтыг хэмжсэн. Удирдагчид нь C ба Rust драйверууд хэвээр байсан бөгөөд үр дүн нь секундэд 1 сая пакет (ойролцоогоор 20 μs) урсгалын хувьд бараг ялгагдахааргүй байв. Go-ийн жолооч сайн ажиллаж, тэргүүлэгчдээс бага зэрэг хоцорч, 20 μs-ийн түвшинд үлджээ. C# драйвер нь ойролцоогоор 50 мкс саатал харуулсан.
Хамгийн урт сааталуудыг JavaScript болон Java драйверууд (300 мкс-ээс их хоцролт) харуулсан.

10 програмчлалын хэл дээрх хувилбаруудын сүлжээний драйверын гүйцэтгэлийн харьцуулалт

Судалгааг C хэлнээс илүү өндөр түвшний хэл дээр драйверууд болон үйлдлийн системийн бүрэлдэхүүн хэсгүүдийг хөгжүүлэх боломжийг үнэлэх зорилгоор хийсэн. Одоогийн байдлаар Линукс дээрх 39 санах ойн асуудлын 40 нь драйверуудтай холбоотой байдаг тул илүү аюулгүй хэл ашиглах, драйверуудыг цөмөөс болон хэрэглэгчийн орон зайд шилжүүлэх зэрэг асуудлууд гарч байна. хамааралтай хэвээр байна үйлдвэрлэгчид энэ чиглэлээр идэвхтэй туршилт хийж байна (жишээлбэл, Google нь үйлдлийн системд зориулсан TCP стекийг боловсруулсан. Fuchsia Go хэлээр CloudFlare компани үүсгэсэн Rust дахь QUIC протоколыг хэрэгжүүлснээр Apple гар утасны төхөөрөмж дээрх TCP стекийг хэрэглэгчийн орон зайд шилжүүлсэн).

Ажлын явцад Rust хэл нь жолоочийг хөгжүүлэхэд хамгийн сайн нэр дэвшигч гэж дүгнэсэн. Rust-ийн чадварууд нь C драйверуудтай харьцуулахад бага түвшний санах ойн менежменттэй холбоотой асуудлуудыг ойролцоогоор 2% -иас 10% -ийн гүйцэтгэлээр алддаг. Go болон C# нь хог хаягдлаас үүдэлтэй миллисекундээс доош хоцрогдолтой нөхцөлд системийн бүрэлдэхүүн хэсгүүдийг бий болгоход тохиромжтой гэж үздэг.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх