Ցանցի վարորդի կատարողականի համեմատությունը ծրագրավորման 10 լեզուներով տարբերակներում

Գերմանական համալսարանների մի խումբ հետազոտողներ опубликовала արդյունքները փորձ, որի ընթացքում մշակվել են 10 գիգաբիթանոց Intel Ixgbe (X10xx) ցանցային քարտերի ստանդարտ դրայվերի 5 տարբերակ ծրագրավորման տարբեր լեզուներով։ Վարորդն աշխատում է օգտագործողի տարածքում և ներդրված է C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript և Python-ում: Կոդ գրելիս հիմնական շեշտը դրվել է հնարավոր լավագույն կատարման հասնելու վրա՝ հաշվի առնելով յուրաքանչյուր լեզվի առանձնահատկությունները։ Բոլոր տարբերակները ֆունկցիոնալությամբ նույնական են և բաղկացած են մոտավորապես 1000 տող կոդից: Ծրագրի զարգացումներ տարածվել BSD լիցենզիայի ներքո:

Վարորդի Rust տարբերակը կատարողականով շատ մոտ է C լեզվով տեղեկատու դրայվերին: 32 փաթեթների բլոկների միաժամանակ ուղարկմամբ բեռնվածության տակ Rust դրայվերը մի փոքր զիջում էր, բայց մեկ բլոկի համար ավելի քան 32 փաթեթով փորձարկումներում արագությունը գործնականում չէր տարբերվում C դրայվերից և ցույց տվեց կատարողականություն 28 միլիոնի մշակման մակարդակում: փաթեթներ վայրկյանում Xeon CPU E3-1230 v2 3.3 ԳՀց սերվերի վրա:

Ցանցի վարորդի կատարողականի համեմատությունը ծրագրավորման 10 լեզուներով տարբերակներում

Կատարման առումով հաջորդ տեղը զբաղեցրին Go և C# լեզուների վարորդները, որոնք ցույց տվեցին բավականին մոտ արդյունքներ (Go-ի դրայվերը հաղթեց մինչև 16 փաթեթի բլոկներով թեստերում և սկսեց մի փոքր կորցնել ավելի քան 16 փաթեթներով թեստերում: բլոկում): Մեկ բլոկի համար 256 փաթեթով, C# դրայվերի առավելագույն կատարողականը կազմում էր մոտավորապես 28 միլիոն փաթեթ վայրկյանում, իսկ Go դրայվերը մոտավորապես 25 միլիոն փաթեթ վայրկյանում:

Հաջորդը, բավականին մոտ արդյունքներով, վարորդներն էին
Java-ը, OCaml-ը և Haskell-ը, որոնք արդեն նկատելիորեն հետ էին մնում նախկինում դիտարկված տարբերակներից և չկարողացան հաղթահարել վայրկյանում 12 միլիոն փաթեթը: Swift-ի և JavaScript-ի դրայվերները ցույց են տվել ավելի մեծ ուշացում՝ կարողանալով մշակել հոսքեր վայրկյանում 5 միլիոն փաթեթի մակարդակով:

Լավագույն վարկանիշը եզրափակել է Python-ի վարորդը, որը կարողացել է վայրկյանում մշակել ընդամենը 0.14 միլիոն փաթեթ։ Python-ի իրականացումն օգտագործվել է առանց JIT-ի և առանց հատուկ օպտիմալացումների թարգմանիչների արագությունը գնահատելու համար (կոդը գործարկվել է CPython 3.7-ի միջոցով և համատեղելի չէր PyPy-ի հետ, սակայն նշվում է, որ տվյալների պահպանման կառուցվածքների օպտիմալացումը կարող է բարելավել աշխատանքը մոտ 10 անգամ: )

Բացի այդ, իրականացվել են հետաձգման թեստեր՝ ցույց տալու բուֆերացման արդյունավետությունը և աղբահանի ազդեցությունը: Թեստավորումը չափել է ուշացումն այն բանից հետո, երբ յուրաքանչյուր փաթեթ ուղարկվել է վարորդի կողմից՝ համեմատած այն ուղարկելու ճշգրիտ ժամանակի հետ: Առաջատարները դեռևս C-ի և Rust-ի վարորդներն էին, որոնց արդյունքները գործնականում չէին տարբերվում վայրկյանում 1 միլիոն փաթեթների հոսքի համար (մոտ 20 µs): Go-ի վարորդը լավ հանդես եկավ՝ միայն մի փոքր զիջելով առաջատարներին և նաև մնալով 20 µs մակարդակում: C# դրայվերը ցույց տվեց մոտավորապես 50 µs ուշացումներ:
Ամենաերկար ուշացումները ցուցադրվել են JavaScript-ի և Java վարորդների կողմից (300 µs-ից ավելի ուշացումներ):

Ցանցի վարորդի կատարողականի համեմատությունը ծրագրավորման 10 լեզուներով տարբերակներում

Հետազոտությունն իրականացվել է՝ գնահատելու համար C-ից ավելի բարձր մակարդակի լեզուներով վարորդների և օպերացիոն համակարգի բաղադրիչների մշակման հնարավորությունը: Ներկայումս Linux-ում հիշողության 39 խնդիրներից 40-ը կապված են դրայվերների հետ, ուստի ավելի անվտանգ լեզու օգտագործելու և դրայվերները միջուկից դուրս և օգտագործողի տարածք տեղափոխելու խնդիրները: մնալ համապատասխան և արտադրողներն արդեն ակտիվորեն փորձարկում են այս ուղղությամբ (օրինակ, Google-ը մշակել է TCP փաթեթ ՕՀ-ի համար Fuchsia Go լեզվով, CloudFlare ընկերությունը ստեղծվել է Rust-ում QUIC արձանագրության ներդրումը, Apple-ը շարժական սարքերի TCP փաթեթը տեղափոխել է օգտագործողի տարածք):

Աշխատանքի ընթացքում եզրակացություն է արվել, որ Rust լեզուն լավագույն թեկնածուն է դրայվերի զարգացման համար։ Rust-ի հնարավորությունները վերացնում են ցածր մակարդակի հիշողության կառավարման հետ կապված խնդիրները՝ C դրայվերների համեմատ աշխատանքի արդյունավետության մոտավորապես 2%-ից 10% կորստի գնով: Go-ն և C#-ը նույնպես հարմար են համարվում համակարգի բաղադրիչներ ստեղծելու համար այն իրավիճակներում, երբ ընդունելի է աղբահանության հետևանքով առաջացած ենթամլիվայրկյանական ուշացումը:

Source: opennet.ru

Добавить комментарий