Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

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 «Mobil developer PRO».

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ë:

Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

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:

Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

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 seqtk. 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 
   -lz

Në parim, seqtk mund të kompilohen me ndihmën e Emscripten. Nëse nuk e keni, mund ta kaloni nëpërmjet Docker.

$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26

Nëse dëshirohet mund ta ndërtoni edhe vetë, 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=1

Minimizimi 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 FS e ngjashme me POSIX, 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:

Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

Figura tregon se në vend të llogaritjeve në njësinë kryesore të shfletuesit, përdoren WebWorkers. 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ë.

Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

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ë.

Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

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ë.

Si e përshpejtuam aplikacionin web 20 herë me ndihmën e WebAssembly

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:

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster