
I den hÀr artikeln diskuteras ett fall kring att snabba upp ett webbaserat program genom att ersÀtta JavaScript-berÀkningar med WebAssembly.
WebAssembly â vad Ă€r det?
Kort sagt Àr det ett binÀrt format av instruktioner för en stackbaserad virtuell maskin. Ofta kallas Wasm (förkortningen) för ett programmeringssprÄk, men sÄ Àr det inte. Instruktionsformatet körs i webblÀsaren tillsammans med JavaScript.
Det Àr viktigt att notera att WebAssembly kan genereras genom att kompilera kÀllkod pÄ sprÄk som C/C++, Rust, Go. HÀr tillÀmpas statisk typning och den sÄ kallade platta minnesmodellen. Koden, som nÀmnts tidigare, lagras i ett kompakt binÀrt format, vilket gör att den körs nÀstan lika snabbt som om programmet kördes via kommandoraden. Dessa möjligheter har lett till en ökning av WebAssembly:s popularitet.
PĂ„minnelse: för alla lĂ€sare av "Habr" â 10 000 rubel rabatt vid registrering för vilken kurs som helst pĂ„ Skillbox med rabattkoden "Habr".
Skillbox rekommenderar: Praktisk kurs .
För nÀrvarande anvÀnds Wasm i mÄnga applikationer, frÄn spel som Doom 3 till webbapplikationer som Autocad och Figma. Wasm tillÀmpas ocksÄ inom serverless berÀkningar.
I denna artikel ges ett exempel pÄ anvÀndningen av Wasm för att snabba upp en analytisk webbservice. För att illustrera detta har vi valt ett fungerande program, skrivet i C, som kommer att kompileras till WebAssembly. Resultatet kommer att anvÀndas för att ersÀtta lÄgpresterande delar av JS.
Transformation av applikationen
I exemplet kommer webbtjÀnsten fastq.bio att anvÀndas, som Àr avsedd för genetiker. Verktyget gör det möjligt att bedöma kvaliteten pÄ DNA-sekvensering.
HÀr Àr ett exempel pÄ programmet i arbete:

Det Àr inte vÀrt att gÄ in pÄ detaljerna i processen, eftersom de Àr ganska komplexa för lekmÀn, men kort sagt kan forskare utifrÄn den ovan nÀmnda infographicen förstÄ om DNA-sekvenseringsprocessen har gÄtt smidigt och vilka problem som uppstÄtt.
Denna tjÀnst har alternativ, skrivbordsprogram. Men fastq.bio gör det möjligt att snabba upp arbetet genom att visualisera data. I de flesta andra fall krÀvs det att man kan arbeta med kommandoraden, men inte alla genetiker har den nödvÀndiga erfarenheten.
All of this works simply. The input consists of data represented in the form of a text file. This file is generated by specialized tools for sequencing. It contains a list of DNA sequences and a quality assessment for each nucleotide. The file format is .fastq, which is why the service got its name.
Implementation in JavaScript
The first step for the user when working with fastq.bio is to select the appropriate file. Using the File object, the application reads a random sample of data from the file and processes that batch. The task of JavaScript here is to perform simple string operations and count metrics. One of them is the number of nucleotides A, C, G, and T across different DNA fragments.
After calculating the necessary metrics, they are visualized using Plotly.js, and the service begins to work with a new data sample. The segmentation is done to improve UX quality. If you work with all the data at once, the process will hang for a while since sequencing results files take up hundreds of gigabytes of storage space. The service takes data chunks ranging from 0.5 to 1 MB and processes them step by step, building graphical data.
Hereâs how it works:

The red rectangle contains the string transformation algorithm for obtaining visualization. This is the most computation-heavy part of the service. Itâs worth trying to replace it with Wasm.
Testing WebAssembly
To assess the feasibility of using Wasm, the project team searched for existing solutions to create QC metrics (QC â quality control) based on fastq files. The search was conducted among tools written in C, C++, or Rust to enable code porting to WebAssembly. Additionally, the tool should not be 'raw'; a service that is already validated by scientists was required.
As a result, the choice was made in favor of . The application is quite popular, it is open-source, and the source language is C.
Before transforming it into Wasm, it is necessary to look at the compilation principle of seqtk for desktop. According to the Makefile, hereâs what you need:
# Compile to binary
$ gcc seqtk.c
-o seqtk
-O2
-lm
-lzIn principle, seqtk can be compiled using Emscripten. If itâs not available, we can manage .
$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26If desired, , but that will take time.
Inuti containern kan emcc anvÀndas som ett alternativ till gcc utan problem:
# Compile to WebAssembly
$ emcc seqtk.c
-o seqtk.js
-O2
-lm
-s USE_ZLIB=1
-s FORCE_FILESYSTEM=1Minst förÀndringar:
IstÀllet för att skriva ut till en binÀrfil anvÀnds Emscripten för att generera filer .wasm och .js, som anvÀnds för att köra WebAssembly-modulen.
För att stödja zlib-biblioteket anvÀnds flaggan USE_ZLIB. Biblioteket Àr vÀletablerat och portat till WebAssembly, och Emscripten inkluderar det i projektet.
Den virtuella filsystemet Emscripten aktiveras. Det Àr , som fungerar i RAM-minnet i webblÀsaren. NÀr sidan uppdateras rensas minnet.
För att förstÄ varför ett virtuellt filsystem behövs Àr det vÀrt att jÀmföra hur seqtk startas frÄn kommandoraden med hur den kompilerade WebAssembly-modulen startas.
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])à tkomst till det virtuella filsystemet behövs för att undvika att skriva om seqtk för strÀng- snarare Àn filinmatning. I detta fall avbildas datasegmentet som filen data.fastq i det virtuella filsystemet med ett anrop pÄ den i main() seqtk.
HÀr Àr den nya arkitekturen:

Bild visar att istÀllet för berÀkningar i huvudtrÄden i webblÀsaren anvÀnds . Denna metod möjliggör att köra berÀkningar i en bakgrundstrÄd utan att försÀmra webblÀsarens responsivitet. Och WebWorker-kontrollern startar arbetaren och hanterar dess interaktion med huvudtrÄden.
Kommandot seqtk körs med hjÀlp av en arbetare pÄ den monterade filen. Efter att arbetaren har avslutat sin körning ger den resultatet i form av ett Promise. NÀr meddelandet mottas av huvudtrÄden anvÀnds resultatet för att uppdatera diagrammen. Och det sker i flera iterationer.
Vad sÀgs om WebAssembly-prestanda?
För att utvÀrdera prestandaförÀndringen anvÀnde projektlaget antalet lÀsoperationer per sekund som parameter. Tiden för att bygga interaktiva diagram ingÄr inte, eftersom JavaScript anvÀnds i bÄda implementationerna.
Vid anvÀndning av «ur-lÄdan»-lösningen var prestandaförbÀttringen nio gÄnger.

Detta Àr ett utomordentligt resultat, men som det visade sig finns det Àven möjlighet att optimera det. MÄnga resultat av QC-analys anvÀnds inte av seqtk, sÄ dessa kan tas bort. Om detta görs förbÀttras resultatet jÀmfört med JS med 13 gÄnger.

Det uppnÄddes genom att helt enkelt kommentera ut printf()-kommandon.
Men det Àr inte allt. Det handlar om att fastq.bio pÄ detta stadium fÄr analyseresultat genom anrop av olika C-funktioner. Varje funktion berÀknar sin egen uppsÀttning egenskaper, sÄ varje filfragment lÀses tvÄ gÄnger.
För att lösa detta problem beslutade vi att kombinera tvÄ funktioner till en. Resultatet blev en 20-faldig ökning av prestandan.

Det Àr vÀrt att notera att ett sÄ anmÀrkningsvÀrt resultat inte alltid kan uppnÄs. I vissa fall minskar prestandan, sÄ det Àr viktigt att bedöma varje enskilt fall.
Som slutsats kan vi sÀga att Wasm verkligen erbjuder möjlighet att förbÀttra applikationens prestanda, men det bör anvÀndas med omsorg.
Skillbox rekommenderar:
- TvÄÄrig praktisk kurs .
- Onlinekurs .
- Praktisk Ärskurs .
KĂ€lla: habr.com
