
Ky artikull shqyrton rastin e përshpejtimit të aplikacioneve në shfletues duke zëvendësuar llogaritjet në JavaScript me WebAssembly.
WebAssembly â çfarĂ« Ă«shtĂ« kjo?
Nëse e themi shkurt, është një format binar instrukcionesh për një makinë virtuale me stack. Shpesh, Wasm (emri i shkurtuar) e quajnë gjuhë programimi, por nuk është kështu. Formati i instrukcioneve ekzekutohet në shfletues në të njëjtën mënyrë si JavaScript.
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se WebAssembly mund tĂ« merret duke kompaktuar burimet nĂ« gjuhĂ« si C/C++, Rust, Go. KĂ«tu pĂ«rdoret tipizimi statistik dhe modeli i quajtur model i sheshtĂ« i memories. Kodi, siç u tha mĂ« lart, ruhet nĂ« njĂ« format binar tĂ« ngjeshur, duke e bĂ«rĂ« atĂ« tĂ« ekzekutohet pothuajse aq shpejt sa nĂ«se aplikacioni do tĂ« nisej me komandĂ«n e linjĂ«s. KĂ«to mundĂ«si kanĂ« kontribuar nĂ« rritjen e popullaritetit tĂ« WebAssembly.
KujtojmĂ«: pĂ«r tĂ« gjithĂ« lexuesit e "Habra" â zbritje prej 10,000 rublej pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promocional "Habr".
Skillbox rekomandon: Kurs praktik .
Në këtë moment, Wasm përdoret në shumë aplikacione, nga lojëra si Doom 3 deri te aplikacione të portuara në web si Autocad dhe Figma. Wasm përdoret gjithashtu në fushën e llogaritjeve pa server.
Në këtë artikull, jepet një shembull i përdorimit të Wasm për të rychunuar një shërbim analitik në internet. Për qartësi, ne morëm një aplikacion funksional të shkruar në C, i cili do të kompilojë në WebAssembly. Rezultati do të përdoret për të zëvendësuar pasazhet e dobëta të JS.
Transformimi i aplikacionit
Në shembull do të përdoret shërbimi browser fastq.bio, i cili është i destinuar për gjenetistët. Ky mjet lejon të vlerësohet cilësia e sekvencimit (dekodimit) të ADN-së.
Ja një shembull i aplikacionit në funksion:

Nuk duhet përmendur në detaje procesi, pasi është mjaft i komplikuar për ata që nuk janë specialistë, por nëse e përmbledhim, shkencëtarët sipas infografikës së lartpërmendur mund të kuptojnë nëse procesi i sekvencimit të ADN-së ka shkuar pa probleme dhe çfarë problemeve kanë lindur.
Ky shërbim ka alternative, programe desktop. Por fastq.bio lejon të përshpejtojë punën, duke vizualizuar të dhënat. Në shumicën e rasteve të tjera, nevojitet të dijmë të punojmë me linjën e komandës, por nuk të gjithë gjenetistët e kanë përvojën e nevojshme.
Gjithçka funksionon thjesht. NĂ« hyrje â tĂ« dhĂ«nat e paraqitura si njĂ« skedar teksti. Ky skedar gjenerohet nga mjete tĂ« specializuara pĂ«r sekvencimin. NĂ« skedar vendoset njĂ« listĂ« sekuencash ADN dhe njĂ« vlerĂ«sim i cilĂ«sisĂ« pĂ«r çdo njĂžleotid. Formati i skedarit Ă«shtĂ« .fastq, kĂ«shtu qĂ« shĂ«rbimi mori njĂ« emĂ«r tĂ« tillĂ«.
Implementimi në JavaScript
Hapi i parë i përdoruesit kur punon me fastq.bio është zgjedhja e skedarit përkatës. Duke përdorur objektin File, aplikacioni lexon një mostër të rastësishme të të dhënave nga skedari dhe përpunon këtë paketë. Detyra e JavaScript këtu është të kryejë operacione të thjeshta me vargje dhe të llogarisë treguesit. Një prej tyre është numri i njohurive A, C, G dhe T në fragmente të ndryshme ADN.
Pas analizimi i treguesve të nevojshëm, ato paraqiten përmes Plotly.js, dhe shërbimi fillon të funksionojë me një grup të ri të të dhënave. Ndarja në fragmente është bërë për të përmirësuar cilësinë e UX-it. Nëse punoni me të gjitha të dhënat njëkohësisht, procesi do të bllokohet për njëfarë kohe, pasi skedarët me rezultatet e sekvencimit zënë qindra gigabajt hapësirë skedari. Shërbimi merr pjesë të dhënash nga 0,5 deri në 1 MB dhe punon me to hapi pas hapi, duke ndërtuar të dhëna grafike.
Ja si funksionon:

Në drejtkëndëshin e kuq vendoset algoritmi i transformimeve të vargjeve për të arritur vizualizimin. Kjo është pjesa më e ngarkuar në aspektin e llogaritjeve të shërbimit. Duhet provuar ta zëvendësoni atë me Wasm.
Testojmë WebAssembly
PĂ«r tĂ« vlerĂ«suar mundĂ«sinĂ« e pĂ«rdorimit tĂ« Wasm, ekipi i projektit ka nisur kĂ«rkimin e zgjidhjeve tĂ« gatshme pĂ«r tĂ« krijuar njĂ« metrikĂ« QC (QC â kontrolli i cilĂ«sisĂ«) mbi bazĂ«n e skedarĂ«ve fastq. KĂ«rkimi u bĂ« nĂ« mesin e mjeteve tĂ« shkruara nĂ« C, C++ ose Rust, pĂ«r tĂ« pasur mundĂ«sinĂ« e portimit tĂ« kodit nĂ« WebAssembly. PĂ«r mĂ« tepĂ«r, mjeti nuk duhet tĂ« jetĂ« "i papĂ«rfunduar", kĂ«rkohej njĂ« shĂ«rbim qĂ« ishte tashmĂ« i verifikuar nga shkencĂ«tarĂ«t.
Si rezultati, u bĂ« zgjedhja pĂ«r . Ky aplikacion Ă«shtĂ« mjaft popullor, Ă«shtĂ« open-source, gjuhĂ« burimi â C.
Para se ta kthejmë në Wasm, vlen të shqyrtohet principi i kompilimit të seqtk për desktop. Sipas Makefile, kjo është ajo që ne kemi nevojë:
# Compile to binary
$ gcc seqtk.c
-o seqtk
-O2
-lm
-lzNë prinsip, seqtk mund të kompilohet me Emscripten. Nëse nuk e kemi, mund ta kalojmë .
$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26Nëse dëshirohet , por kjo kërkon kohë.
Brenda kontejnerit, pa asnjë problem, mund të marrim emcc si alternativë për gcc:
# Compile to WebAssembly
$ emcc seqtk.c
-o seqtk.js
-O2
-lm
-s USE_ZLIB=1
-s FORCE_FILESYSTEM=1Ndryshimet janë minimale:
Në vend të daljes në një skedar binar, Emscripten përdor .wasm dhe .js për të gjeneruar skedarë, të cilat përdoren për të ngarkuar modulin WebAssembly.
Për të mbështetur bibliotekën zlib përdoret flag-u USE_ZLIB. Biblioteka është e njohur dhe e portuar në WebAssembly, dhe Emscripten e përfshin në projekt.
Aktivizohet sistemi virtual i skedarëve Emscripten. Ky është , e cila punon në memorjen ram brenda shfletuesit. Kur rifreskohet faqja, memorja pastrohet.
Për të kuptuar pse nevojitet një sistem i virtualizuar për skedarët, do të ishte e dobishme të krahasohet mënyra e ekzekutimit të seqtk nga rreshti i komandave me mënyrën e ekzekutimit të modulit të përhapur WebAssembly.
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])Qasja në sistemin virtual të skedarëve është e nevojshme për të mos e riprogramuar seqtk për hyrjen nga rreshti, në vend të asaj nga skedari. Në këtë rast, fragmendi i të dhënave paraqitet si skedar data.fastq në FSh-në virtuale me thirrjen e saj main() seqtk.
Ja arkitektura e re:

Figura tregon se në vend të llogaritjeve në kanalin kryesor të shfletuesit përdoren . Kjo metodë e mundëson ekzekutimin e llogaritjeve në një kanal të prapmë, duke mos e përkeqësuar reagimin e shfletuesit. Ndërsa kontrolluesi i WebWorker aktivizon Worker-in, duke menaxhuar ndërveprimin e tij me kanalin kryesor.
Komanda seqtk ekzekutohet me anë të Worker-it në skedarin e montuar. Pasi përfundon ekzekutimi, Worker-i jep rezultatin në formën e një Promise. Kur mesazhi merret nga kanali kryesor, rezultati përdoret për të përmirësuar grafikët. Dhe kështu në disa iteracione.
ĂfarĂ« ndodh me performancĂ«n e WebAssembly?
Për të valutuar ndryshimin e performancës, ekipi i projektit shfrytëzoi parametrin e numrit të operacioneve të leximit për sekondë. Koha e ndërtimit të grafikëve interaktivë nuk merret parasysh, pasi në të dyja implementimet përdoret JavaScript.
Deri më tani, rritja e performancës me zgjidhjen 'nga kutia' ka qenë nëntë herë.

Ky është një rezultat i shkëlqyer, megjithatë, siç u zbulua, ka mundësi për optimizim edhe më tej. Problemi është se një numër i madh i rezultateve të analizës QC nuk përdorin seqtk, kështu që ato mund të hiqen. Nëse bëhet kjo, rezultati në krahasim me JS përmirësohet 13 herë.

Arritja e këtij rezultati u realizua me thjesht komentin e komandave printf().
Por kjo nuk Ă«shtĂ« gjithçka. E vĂ«rteta Ă«shtĂ« se nĂ« kĂ«tĂ« hap, fastq.bio merr rezultatet e analizĂ«s me thirrjen e funksioneve tĂ« ndryshme tĂ« C. Ădo njĂ«ra prej tyre llogarit njĂ« grup karakteristikash, kĂ«shtu qĂ« çdo fragment i skedarit Ă«shtĂ« lexuar dy herĂ«.
Për të zgjidhur këtë problem, u vendos të kombinohen dy funksione në një. Si rezultat, performanca u rrit në 20 herë.

ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se njĂ« rezultat kaq tĂ« shkĂ«lqyer nuk mund tĂ« arrihet gjithmonĂ«. NĂ« disa raste, performanca bie, prandaj duhet tĂ« vlerĂ«sohet çdo rast konkret.
Si përfundim, mund të themi se Wasm vërtet ofron mundësi për të përmirësuar performancën e aplikacionit, por duhet ta përdorim me mençuri.
Skillbox rekomandon:
- Kurs praktik dyvjeçar .
- Kurs online .
- Kurs praktik njëvjeçar .
Burimi: habr.com
