Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассматриваСтся кСйс ΠΏΠΎ ΡƒΡΠΊΠΎΡ€Π΅Π½ΠΈΡŽ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½ΠΎΠ³ΠΎ прилоТСния Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΌΠ΅Π½Ρƒ вычислСний JavaScript Π½Π° WebAssembly.

WebAssembly β€” Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅?

Если ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ, Ρ‚ΠΎ это это Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ инструкций для стСковой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Часто Wasm (сокращСнноС Π½Π°Π·Π²Π°Π½ΠΈΠ΅) Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ языком программирования, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ. Π€ΠΎΡ€ΠΌΠ°Ρ‚ инструкций исполняСтся Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ наряду с JavaScript.

Π’Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ WebAssembly ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ компиляции исходников Π½Π° Ρ‚Π°ΠΊΠΈΡ… языках, ΠΊΠ°ΠΊ C/C++, Rust, Go. Π—Π΄Π΅ΡΡŒ примСняСтся статистичСская типизация ΠΈ Ρ‚Π°ΠΊ называСмая плоская модСль памяти. Код, ΠΊΠ°ΠΊ сказано Π²Ρ‹ΡˆΠ΅, хранится Π² ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, благодаря Ρ‡Π΅ΠΌΡƒ выполняСтся ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ быстро, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π­Ρ‚ΠΈ возмоТности ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ ΠΊ росту популярности WebAssembly.

НапоминаСм: для всСх Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Β«Π₯Π°Π±Ρ€Π°Β» β€” скидка 10 000 Ρ€ΡƒΠ±Π»Π΅ΠΉ ΠΏΡ€ΠΈ записи Π½Π° любой курс Skillbox ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄Ρƒ Β«Π₯Π°Π±Ρ€Β».

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ курс Β«ΠœΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ PROΒ».

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Wasm ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… прилоТСниях, ΠΎΡ‚ ΠΈΠ³Ρ€ Π²Ρ€ΠΎΠ΄Π΅ Doom 3 Π΄ΠΎ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Π²Π΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Autocad ΠΈ Figma. Wasm примСняСтся ΠΈ Π² Ρ‚Π°ΠΊΠΎΠΉ сфСрС, ΠΊΠ°ΠΊ serverless вычислСния.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Wasm для ускорСния аналитичСского Π²Π΅Π±-сСрвиса. Для наглядности ΠΌΡ‹ взяли Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, написанноС Π½Π° Π‘, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ скомпилируСтся Π² WebAssembly. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ использован для Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΌΠ°Π»ΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… участков JS.

Врансформация прилоТСния

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹ΠΉ сСрвис fastq.bio, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Π³Π΅Π½Π΅Ρ‚ΠΈΠΊΠΎΠ². Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ позволяСт ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ качСство сСквСнирования (Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ) Π”ΠΠš.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния Π² Ρ€Π°Π±ΠΎΡ‚Π΅:

Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ процСсса Π½Π΅ стоит ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ довольно слоТны для нСспСциалистов, Π½ΠΎ Ссли Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅, Ρ‚ΠΎ ΡƒΡ‡Π΅Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΈΠ½Ρ„ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΊΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΡ€ΠΎΡˆΠ΅Π» Π»ΠΈ процСсс сСквСнирования Π”ΠΠš Π³Π»Π°Π΄ΠΊΠΎ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π£ этого сСрвиса Π΅ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, дСсктопныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Но fastq.bio позволяСт ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, визуализируя Π΄Π°Π½Π½Ρ‹Π΅. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаСв Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкой, Π½ΠΎ Π½Π΅ Ρƒ всСх Π³Π΅Π½Π΅Ρ‚ΠΈΠΊΠΎΠ² Π΅ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚.

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ всС просто. На Π²Ρ…ΠΎΠ΄Π΅ β€” Π΄Π°Π½Π½Ρ‹Π΅, прСдставляСмыС Π² Π²ΠΈΠ΄Π΅ тСкстового Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» гСнСрируСтся спСциализированными инструмСнтами для сСквСнирования. Π’ Ρ„Π°ΠΉΠ»Π΅ размСщаСтся список ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π”ΠΠš ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ° качСства для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΡƒΠΊΠ»Π΅ΠΎΡ‚ΠΈΠ΄Π°. Π€ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π° .fastq, поэтому сСрвис ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Ρ‚Π°ΠΊΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅.

РСализация Π½Π° JavaScript

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с fastq.bio β€” Π²Ρ‹Π±ΠΎΡ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ File, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ считываСт ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ этот ΠΏΠ°ΠΊΠ΅Ρ‚. Π—Π°Π΄Π°Ρ‡Π° JavaScript здСсь β€” Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ нСслоТных строковых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ подсчСт ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. Один ΠΈΠ· Π½ΠΈΡ… β€” количСство Π½ΡƒΠΊΠ»Π΅ΠΎΡ‚ΠΈΠ΄ΠΎΠ² A, C, G ΠΈ T Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ… Π”ΠΠš.

ПослС просчСта Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΠ½ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Plotly.js, Π° сСрвис Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΎΠ²ΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ сдСлано для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ качСства UX. Если Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со всСми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ сразу, процСсс зависнСт Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ сСквСнирования Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ сотни Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ пространства. БСрвис ΠΆΠ΅ Π±Π΅Ρ€Π΅Ρ‚ участки Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΡ‚ 0,5 Π΄ΠΎ 1 Мб ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π½ΠΈΠΌΠΈ шаг Π·Π° шагом, выстраивая графичСскиС Π΄Π°Π½Π½Ρ‹Π΅.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

Π’ красном ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ размСщаСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ строковых ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ для получСния Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ нагруТСнная с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния вычислСний Ρ‡Π°ΡΡ‚ΡŒ сСрвиса. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° Wasm.

ВСстируСм WebAssembly

Для ΠΎΡ†Π΅Π½ΠΊΠΈ возмоТности использования Wasm ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° занялась поиском Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для создания QC-ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ (QC β€” quality control) Π½Π° основС Ρ„Π°ΠΉΠ»ΠΎΠ² fastq. Поиск вСлся срСди инструмСнтов, написанных Π½Π° Π‘, Π‘++ ΠΈΠ»ΠΈ Rust, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° WebAssembly. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, инструмСнт Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ «сырым», трСбовался сСрвис, ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΉ ΡƒΡ‡Π΅Π½Ρ‹ΠΌΠΈ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π±ΠΎΡ€ Π±Ρ‹Π» сдСлан Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ seqtk. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ довольно популярно, ΠΎΠ½ΠΎ open-source, исходный язык β€” Π‘.

ΠŸΠ΅Ρ€Π΅Π΄ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² Wasm стоит ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ компиляции seqtk для дСсктопа. Богласно Makefile, Π²ΠΎΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ:

# Compile to binary
$ gcc seqtk.c 
   -o seqtk 
   -O2 
   -lm 
   -lz

Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ seqtk ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Emscripten. Если Π΅Π³ΠΎ Π½Π΅Ρ‚, обходимся ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Docker.

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

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ Π½Π° это Π½ΡƒΠΆΠ½ΠΎ врСмя.

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ emcc Π² качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ gcc:

# Compile to WebAssembly
$ emcc seqtk.c 
    -o seqtk.js 
    -O2 
    -lm 
    -s USE_ZLIB=1 
    -s FORCE_FILESYSTEM=1

ИзмСнСний ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ:

ВмСсто Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Emscripten для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ .wasm ΠΈ .js, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСтся для запуска модуля WebAssemby.

Для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ zlib ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„Π»Π°Π³ USE_ZLIB. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° распространСна ΠΈ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° WebAssembly, Π° Emscripten Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΅Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

АктивируСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ файловая систСма Emscrippten. Π­Ρ‚ΠΎ POSIX-подобная Π€Π‘, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Когда страница обновляСтся, ΠΏΠ°ΠΌΡΡ‚ΡŒ очищаСтся.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ файловая систСма, стоит ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ способ запуска seqtk ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки со способом запуска скомпилированного модуля WebAssembly.

# On the command line
$ ./seqtk fqchk data.fastq
 
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ seqtk ΠΏΠΎΠ΄ строковый, Π° Π½Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ Π²Π²ΠΎΠ΄. Π’ этом случаС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… отобраТаСтся ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ» data.fastq Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Π€Π‘ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π½Π° Π½Π΅ΠΌ main() seqtk.

Π’ΠΎΡ‚ новая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°:

Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

Рисунок дСмонстрируСт, Ρ‡Ρ‚ΠΎ вмСсто вычислСний Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ WebWorkers. Π­Ρ‚ΠΎΡ‚ способ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ вычислСния Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π½Π΅ ΡƒΡ…ΡƒΠ΄ΡˆΠ°Ρ ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Ну Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ WebWorker запускаСт Worker, управляя Π΅Π³ΠΎ взаимодСйствиСм с основным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

Команда seqtk запускаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Worker Π½Π° ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния Worker Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π²ΠΈΠ΄Π΅ Promise. Когда сообщСниС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обновлСния Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ². И Ρ‚Π°ΠΊ Π² нСсколько ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ.

Π§Ρ‚ΠΎ насчСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ WebAssembly?

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° воспользовалась ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ количСства ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния Π² сСкунду. ВрСмя построСния ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² Π½Π΅ учитываСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΠ±Π΅ΠΈΡ… имплСмСнтациях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ JavaScript.

ΠŸΡ€ΠΈ использовании Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ составил Π΄Π΅Π²ΡΡ‚ΡŒ Ρ€Π°Π·.

Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

Π­Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π½ΠΎ, ΠΊΠ°ΠΊ оказалось, Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΅Π³ΠΎ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ большоС количСство Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² QC-Π°Π½Π°Π»ΠΈΠ·Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ seqtk, поэтому ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ. Если это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с JS ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ΡΡ Π² 13 Ρ€Π°Π·.

Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

Π”ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π΅Π³ΠΎ ΡƒΠ΄Π°Π»ΠΎΡΡŒ простым ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ printf().

Но ΠΈ это Π½Π΅ всС. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° этом этапС fastq.bio ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π‘. Π›ΡŽΠ±Π°Ρ ΠΈΠ· Π½ΠΈΡ… вычисляСт свой Π½Π°Π±ΠΎΡ€ характСристик, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Ρ„Π°ΠΉΠ»Π° читался ΠΏΠΎ Π΄Π²Π° Ρ€Π°Π·Π°.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠ΄Π½Ρƒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»Π°ΡΡŒ Π² 20 Ρ€Π°Π·.

Как ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WebAssembly Π² 20 Ρ€Π°Π· Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ускорили

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Π΄Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°Π΄Π°Π΅Ρ‚, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ стоит ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ случай.

Π’ качСствС Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Wasm Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ с ΡƒΠΌΠΎΠΌ.

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ