
Në këtë artikull shqyrtohet rasti i shpejtimit të aplikacioneve në shfletues përmes zëvendësimit të llogaritjeve JavaScript me WebAssembly.
ĂfarĂ« Ă«shtĂ« WebAssembly?
Nëse e shohim shkurt, kjo është një format binar instrukcionesh për makinat virtuale me stack. Shpesh Wasm (emri i shkurtuar) quhet gjuhë programimi, por kjo nuk është e saktë. Formati i instrukcioneve ekzekutohet në shfletues së bashku me JavaScript.
ĂshtĂ« e rĂ«ndĂ«sishme se WebAssembly mund tĂ« merret pĂ«rmes kompilimit tĂ« kodit burimor nĂ« gjuhĂ« si C/C++, Rust, Go. KĂ«tu aplikohet tipizimi statik dhe modeli i quajtur model i sheshtĂ« i memories. Kodi, siç Ă«shtĂ« thĂ«nĂ« mĂ« sipĂ«r, ruhet nĂ« njĂ« format binar kompakt, duke e bĂ«rĂ« atĂ« tĂ« ekzekutohet pothuajse po aq shpejt sa nĂ«se aplikacioni do tĂ« ishte nisur pĂ«rmes komandave tĂ« linjĂ«s. KĂ«to mundĂ«si çuan nĂ« rritjen e popullaritetit tĂ« WebAssembly.
KujtojmĂ«: pĂ«r tĂ« gjithĂ« lexuesit e «Habra» â zbritje prej 10,000 rublesh pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promovues «Habr».
Skillbox rekomandon: Kurs praktik .
Aktualisht, Wasm përdoret në shumë aplikacione, nga lojrat si Doom 3 deri te aplikacionet e portuara në web si Autocad dhe Figma. Wasm përdoret edhe në fushën e llogaritjeve pa server.
Në këtë artikull, jepet një shembull i përdorimit të Wasm për shpejtimin e një shërbimi analitik në web. Për ilustërimin, kemi marrë 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 pjesët me performancë të ulët të JS.
Transformimi i aplikacionit
Në shembull do të përdoret shërbimi në shfletues fastq.bio, i cili është i destinuar për gjenetikën. Ky vegël lejon vlerësimin e cilësisë së sekvencimit (dekodimit) të ADN-së.
Ja një shembull i aplikacionit në punë:

Detajet e procesit nuk duhet të jepen, pasi ato janë krejt të komplikuara për ata që nuk janë specialistë, por nëse flasim shkurt, shkencëtarët, sipas infografikës së lartpërmendur, mund të kuptojnë nëse procesi i sekvencimit të ADN-së kaloi pa probleme dhe çfarë problemeve ishin shfaqur.
Ky shërbim ka alternativa, programe desktop. Por fastq.bio lejon shpejtimin e punës duke vizualizuar të dhënat. Në shumicën e rasteve të tjera, duhet të dimë si të punojmë me komandën e linjës, por jo të gjithë gjenetikët kanë përvojën e nevojshme.
TĂ« gjitha funksionon thjesht. NĂ« hyrje â tĂ« dhĂ«nat e paraqitura nĂ« formĂ«n e njĂ« skedari teksti. Ky skedar gjenerohet nga mjetet e specializuara pĂ«r sekvencimin. NĂ« skedar ndodhet njĂ« listĂ« e sekuencave tĂ« ADN-sĂ« dhe vlerĂ«simi i cilĂ«sisĂ« pĂ«r secilin nukleotid. Formati i skedarit Ă«shtĂ« .fastq, prandaj shĂ«rbimi mori kĂ«tĂ« emĂ«r.
Implementimi në JavaScript
Hapi i parë i përdoruesit gjatë punës me fastq.bio është zgjedhja e skedarit përkatës. Duke përdorur objektin File, aplikacioni lexon një mostër rastësore të të dhënave nga skedari dhe përpunon këtë paketë. Detyra e JavaScript këtu është kryerja e operacioneve të thjeshta me vargje dhe llogaritja e parametrave. Njëra prej tyre është numri i nukleotideve A, C, G dhe T në fragmente të ndryshme të ADN-së.
Pas llogaritjes së parametrave të nevojshëm, ata vizualizohen me ndihmën e Plotly.js, dhe shërbimi fillon të punojë me një mostër të re të të dhënave. Ndarja në fragmente është bërë për të përmirësuar cilësinë e UX. Nëse punoni me të gjitha të dhënat në të njëjtën kohë, procesi do të ngec për njëfarë kohe, pasi skedarët me rezultatet e sekvencimit zënë qindra gigabajt hapësirë skedari. Sidoqoftë, shërbimi merr pjesë të të dhënave me madhësi nga 0.5 deri në 1 MB dhe punon me to hap pas hapi, duke ndërtuar të dhënat grafike.
Ja si funksionon:

Në drejtkëndëshin e kuq ndodhet algoritmi i transformimeve të vargjeve për të marrë vizualizimin. Kjo është pjesa më e ngarkuar në aspektin e llogaritjeve të shërbimit. Ja vlen të provoni ta zëvendësoni atë me Wasm.
Testimi i WebAssembly
PĂ«r tĂ« vlerĂ«suar mundĂ«sinĂ« e pĂ«rdorimit tĂ« Wasm, ekipi i projektit u angazhua nĂ« kĂ«rkimin e zgjidhjeve tĂ« gatshme pĂ«r krijimin e metrikĂ«s QC (QC â kontrolli i cilĂ«sisĂ«) nĂ« bazĂ« tĂ« skedarĂ«ve fastq. KĂ«rkimi u zhvillua midis mjeteve tĂ« shkruara nĂ« C, C++ ose Rust, pĂ«r tĂ« pasur mundĂ«sinĂ« pĂ«r tĂ« portuar kodin nĂ« WebAssembly. PĂ«r mĂ« tepĂ«r, instrumenti nuk duhet tĂ« jetĂ« "i papĂ«rfunduar", kishte nevojĂ« pĂ«r njĂ« shĂ«rbim tĂ« verifikuar nga shkencĂ«tarĂ«t.
Si rezultat, u bĂ« zgjidhja pĂ«r . Aplikacioni Ă«shtĂ« mjaft i popullarizuar, ai Ă«shtĂ« open-source, gjuha origjinale â C.
Para se të konvertohet në Wasm, vlen të shikoni parimin e kompilimit të seqtk për desktopin. Sipas Makefile, ja çfarë nevojitet:
# Compile to binary
$ gcc seqtk.c
-o seqtk
-O2
-lm
-lzNë parim, seqtk mund të kompilohen me ndihmën e Emscripten. Nëse nuk e keni, mund ta kaloni .
$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26Nëse dëshirohet , por për këtë nevojitet kohë.
Brenda e kontejnerit mund të përdorë emcc si alternativë për gcc pa probleme:
# Compile to WebAssembly
$ emcc seqtk.c
-o seqtk.js
-O2
-lm
-s USE_ZLIB=1
-s FORCE_FILESYSTEM=1Minimizimi i ndryshimeve:
Në vend të output-it në skedarin binar, Emscripten përdor .wasm dhe .js për të gjeneruar skedarë, të cilët përdoren për të nisur modulin WebAssembly.
Për të mbështetur bibliotekën zlib, përdoret flagu USE_ZLIB. Biblioteka është e njohur dhe e portuar në WebAssembly, dhe Emscripten e përfshin atë në projekt.
Aktivizohet sistemi i skedarëve virtual Emscripten. Kjo , funksionon në memorien e brendshme të shfletuesit. Kur faqja rifreskohet, memorja zbrazet.
Për të kuptuar pse është e nevojshme një sistem skedari virtual, është e dobishme të krahasohet mënyra e ekzekutimit të seqtk nga linja e komandës me mënyrën e ekzekutimit të modulit të kompiliuar WebAssembly.
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])Qasja në sistemin e skedarëve virtual është e nevojshme për të mos e riprojektuar seqtk për input string, jo për input skedari. Në këtë rast, një fragment të dhënash tregohet si skedar data.fastq në FS-në virtuale me thirrjen e main() seqtk.
Kjo është arkitektura e re:

Figura tregon se në vend të llogaritjeve në njësinë kryesore të shfletuesit, përdoren . Kjo metodë lejon ekzekutimin e llogaritjeve në një proces në sfond, pa e përkeqësuar reagimin e shfletuesit. Menaxherët e WebWorker nisën derën, duke menaxhuar ndërveprimin e saj me procesin kryesor.
Ekzekutimi i komandës seqtk realizohet me anë të Punëtorit mbi skedarin e montuar. Pasi të përfundojë ekzekutimi, Punëtori jep rezultatin në formën e një Promise. Kur mesazhi merret nga procesi kryesor, rezultati përdoret për të përmirësuar grafiket. Kështu, në disa iteracione.
Si qëndron performanca e WebAssembly?
Për të vlerësuar ndryshimin në performancë, ekipi i projektit përdori parametrin e numrit të operacioneve të leximit për sekondë. Koha e ndërtimit të grafikeve interaktive nuk merret parasysh, pasi në të dyja implementimet përdoret JavaScript.
Duke përdorur zgjidhjen "nga kutia", rritja e performancës ishte nëntë herë.

Ky është një rezultat i shkëlqyer, por, siç doli, ka mundësi për optimizim edhe më të mirë. Problemi qëndron në faktin se shumë rezultate të analizës QC nuk përdoren nga seqtk, kështu që ato mund të eliminohen. Nëse bëhet kjo, rezultati përmbledhës krahasuar me JS përmirësohet 13 herë.

Arritja u bë e thjeshtë duke komentuar komandat printf().
Por edhe kjo nuk Ă«shtĂ« e gjitha. E vĂ«rteta Ă«shtĂ« se nĂ« kĂ«tĂ« etapĂ« fastq.bio merr rezultatet e analizĂ«s duke thirrur funksione tĂ« ndryshme C. Ădo njĂ« prej tyre llogarit grupe tĂ« ndryshme karakteristikash, kĂ«shtu qĂ« çdo fragment i skedarit u lexua dy herĂ«.
Për të zgjidhur këtë problem, u vendos të kombinohen dy funksione në një. Si rezultat, performanca u rrit 20 herë.

Dëshirohet të theksohet se një rezultat kaq të shkëlqyer nuk është gjithmonë e mundur ta arrihet. Në disa raste, performanca bie, prandaj është e rëndësishme të vlerësohet çdo rast për veç.
Si përfundim, mund të themi se Wasm në të 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:
- Kursi praktik dyvjeçar .
- Kurs online .
- Kurs praktik njëvjeçar .
Burimi: habr.com
