Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

Π’Π°Π·ΠΈ статия обсъТда случай Π½Π° ускоряванС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ Ρ‡Ρ€Π΅Π· замяна Π½Π° изчислСнията Π½Π° JavaScript с WebAssembly.

WebAssembly - ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Ρ‚ΠΎΠ²Π°?

Накратко, Ρ‚ΠΎΠ²Π° Π΅ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° инструкции Π·Π° ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина. ЧСсто Wasm (ΡΡŠΠΊΡ€Π°Ρ‚Π΅Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅) сС Π½Π°Ρ€ΠΈΡ‡Π° Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅, Π½ΠΎ Π½Π΅ Π΅ Ρ‚Π°ΠΊΠ°. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΡŠΡ‚ Π½Π° инструкцията сС изпълнява Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π·Π°Π΅Π΄Π½ΠΎ с JavaScript.

Π’Π°ΠΆΠ½ΠΎ Π΅ WebAssembly Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Ρ‡Ρ€Π΅Π· ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ Π½Π° Π΅Π·ΠΈΡ†ΠΈ ΠΊΠ°Ρ‚ΠΎ C / C ++, Rust, Go. Π’ΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° статистичСско Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€Π°Π½Π΅ ΠΈ Ρ‚Π°ΠΊΠ° нарСчСния ΠΌΠΎΠ΄Π΅Π» Π½Π° плоска ΠΏΠ°ΠΌΠ΅Ρ‚. ΠšΠΎΠ΄ΡŠΡ‚, ΠΊΠ°ΠΊΡ‚ΠΎ Π±Π΅ спомСнато ΠΏΠΎ-Π³ΠΎΡ€Π΅, сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π΅Π½ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΊΠΎΠ΅Ρ‚ΠΎ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π±ΡŠΡ€Π·, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π°ΠΊΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ сС стартира ΠΎΡ‚ командния Ρ€Π΅Π΄. Π’Π΅Π·ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ²Π΅Π΄ΠΎΡ…Π° Π΄ΠΎ повишаванС Π½Π° популярността Π½Π° WebAssembly.

НапомнямС Π²ΠΈ: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС във всСки курс Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ промоционалния ΠΊΠΎΠ΄ Π½Π° "Habr".

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ курс β€žΠœΠΎΠ±ΠΈΠ»Π΅Π½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ PROβ€œ.

Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Wasm сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΌΠ½ΠΎΠ³ΠΎ прилоТСния, ΠΎΡ‚ ΠΈΠ³Ρ€ΠΈ ΠΊΠ°Ρ‚ΠΎ Doom 3 Π΄ΠΎ ΡƒΠ΅Π± прСнСсСни прилоТСния ΠΊΠ°Ρ‚ΠΎ Autocad ΠΈ Figma. Wasm сС ΠΏΡ€ΠΈΠ»Π°Π³Π° ΠΈ Π² Ρ‚Π°ΠΊΠ°Π²Π° област ΠΊΠ°Ρ‚ΠΎ изчислСния Π±Π΅Π· ΡΡŠΡ€Π²ΡŠΡ€.

Π’Π°Π·ΠΈ статия прСдоставя ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Wasm Π·Π° ускоряванС Π½Π° ΡƒΠ΅Π± услуга Π·Π° Π°Π½Π°Π»ΠΈΠ·. Π—Π° ΠΏΠΎ-голяма яснота Π²Π·Π΅Ρ…ΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, написано Π½Π° C, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° Π² WebAssembly. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Ρ‰Π΅ бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° замяна Π½Π° нискоСфСктивни JS сСкции.

Врансформация Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΡŠΡ‚ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ услугата fastq.bio, която Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π·Π° Π³Π΅Π½Π΅Ρ‚ΠΈΡ†ΠΈ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΡŠΡ‚ Π²ΠΈ позволява Π΄Π° ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅ качСството Π½Π° Π”ΠΠš сСквСниранСто (Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ).

Π•Ρ‚ΠΎ Π΅Π΄Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² дСйствиС:

Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

НС Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС Π΄Π°Π²Π°Ρ‚ подробности Π·Π° процСса, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ са доста слоТни Π·Π° нСспСциалисти, Π½ΠΎ Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ, ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π³ΠΎΡ€Π½Π°Ρ‚Π° ΠΈΠ½Ρ„ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΊΠ°, Π·Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π°Ρ‚ Π΄Π°Π»ΠΈ ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° сСквСниранС Π½Π° Π”ΠΠš Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π» Π³Π»Π°Π΄ΠΊΠΎ ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ са възникнали.

Π’Π°Π·ΠΈ услуга ΠΈΠΌΠ° Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΈ, дСсктоп ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ. Но fastq.bio Π²ΠΈ позволява Π΄Π° ускоритС Π½Π΅Ρ‰Π°Ρ‚Π°, ΠΊΠ°Ρ‚ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅. Π’ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ случаи трябва Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с командния Ρ€Π΅Π΄, Π½ΠΎ Π½Π΅ всички Π³Π΅Π½Π΅Ρ‚ΠΈΡ†ΠΈ ΠΈΠΌΠ°Ρ‚ нСобходимия ΠΎΠΏΠΈΡ‚.

Всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ просто. Π’Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ са прСдставСни ΠΊΠ°Ρ‚ΠΎ тСкстов Ρ„Π°ΠΉΠ». Π’ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΎΡ‚ спСциализирани инструмСнти Π·Π° сСквСниранС. Π€Π°ΠΉΠ»ΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° списък с Π”ΠΠš послСдоватСлности ΠΈ качСствСн Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π·Π° всСки Π½ΡƒΠΊΠ»Π΅ΠΎΡ‚ΠΈΠ΄. Ѐайловият Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΅ .fastq, ΠΎΡ‚ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΈΠ΄Π²Π° ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° услугата.

ВнСдряванС Π² JavaScript

ΠŸΡŠΡ€Π²Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π·Π° потрСбитСля ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с fastq.bio Π΅ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ подходящия Ρ„Π°ΠΉΠ». Използвайки ΠΎΠ±Π΅ΠΊΡ‚Π° File, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‡Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΠΈΠ·Π²Π°Π΄ΠΊΠ° ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° Ρ‚Π°Π·ΠΈ ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄Π°. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π½Π° JavaScript Ρ‚ΡƒΠΊ Π΅ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° прости ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π½ΠΈΠ·ΠΎΠ²Π΅ ΠΈ Π΄Π° изчислява СкспонСнти. Π•Π΄ΠΈΠ½ ΠΎΡ‚ тях Π΅ броят Π½Π° Π½ΡƒΠΊΠ»Π΅ΠΎΡ‚ΠΈΠ΄ΠΈΡ‚Π΅ A, C, G ΠΈ T Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π”ΠΠš Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ.

Π‘Π»Π΅Π΄ изчисляванС Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Ρ‚Π΅ сС Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Plotly.js ΠΈ услугата Π·Π°ΠΏΠΎΡ‡Π²Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π½ΠΎΠ²Π° ΠΈΠ·Π²Π°Π΄ΠΊΠ° ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ. РаздСлянСто Π½Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ сС ΠΏΡ€Π°Π²ΠΈ, Π·Π° Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ качСството Π½Π° UX. Ако Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с всички Π΄Π°Π½Π½ΠΈ навСднъТ, ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Ρ‰Π΅ виси Π·Π° извСстно Π²Ρ€Π΅ΠΌΠ΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ с Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ послСдоватСлността Π·Π°Π΅ΠΌΠ°Ρ‚ стотици Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎ пространство. Услугата, ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° страна, Π²Π·Π΅ΠΌΠ° сСкции с Π΄Π°Π½Π½ΠΈ с Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚ 0,5 Π΄ΠΎ 1 MB ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ с тях ΡΡ‚ΡŠΠΏΠΊΠ° ΠΏΠΎ ΡΡ‚ΡŠΠΏΠΊΠ°, ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°ΠΉΠΊΠΈ Π³Ρ€Π°Ρ„ΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ²Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ:

Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

ЧСрвСният ΠΏΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π½ΠΈΠΊ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π·Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅ Π·Π° Ρ€Π΅Π½Π΄ΠΈΡ€Π°Π½Π΅. Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΉ-Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π΅Π½Π°Ρ‚Π° ΠΎΡ‚ изчислСния част ΠΎΡ‚ услугата. Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ Π΄Π° Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ с Wasm.

ВСстванС Π½Π° WebAssembly

Π—Π° Π΄Π° ΠΎΡ†Π΅Π½ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Wasm, Π΅ΠΊΠΈΠΏΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π·Π°ΠΏΠΎΡ‡Π½Π° Π΄Π° Ρ‚ΡŠΡ€ΡΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π° създаванС Π½Π° QC ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° (QC - ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° качСството) Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° fastq Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π’ΡŠΡ€ΡΠ΅Π½Π΅Ρ‚ΠΎ бСшС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ΅Π½ΠΎ срСд инструмСнти, написани Π½Π° C, C ++ ΠΈΠ»ΠΈ Rust, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π΄Π° Π΅ възмоТно прСнасянСто Π½Π° ΠΊΠΎΠ΄Π° към WebAssembly. ОсвСн Ρ‚ΠΎΠ²Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΡŠΡ‚ Π½Π΅ трябва Π΄Π° Π΅ "суров", изисква сС услуга, която Π²Π΅Ρ‡Π΅ Π΅ тСствана ΠΎΡ‚ ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·Π±ΠΎΡ€ΡŠΡ‚ бСшС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ Π² ΠΏΠΎΠ»Π·Π° Π½Π° seqtk. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ доста популярно, Ρ‚ΠΎ Π΅ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, изходният Π΅Π·ΠΈΠΊ Π΅ C.

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Ρ‚Π΅ към Wasm, трябва Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ‚Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° seqtk Π·Π° работния ΠΏΠ»ΠΎΡ‚. Π‘ΠΏΠΎΡ€Π΅Π΄ Makefile, Π΅Ρ‚ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

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

По ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‚Π΅ seqtk с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Emscripten. Ако Π³ΠΎ няма, Ρ‰Π΅ сС справим. Π”ΠΎΠΊΠ΅Ρ€ Π½Π°Ρ‡ΠΈΠ½.

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

Π€Π»Π°Π³ΡŠΡ‚ USE_ZLIB сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° zlib. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° сС разпространява ΠΈ прСнася към WebAssembly, Π° Emscripten я Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма Emscriptpten Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π°. Π’ΠΎΠ²Π° POSIX-ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ FS, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ Π² RAM Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°. ΠšΠΎΠ³Π°Ρ‚ΠΎ страницата сС ΠΎΠ±Π½ΠΎΠ²ΠΈ, ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° сС изчиства.

Π—Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π·Π°Ρ‰ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма, струва си Π΄Π° сравнитС Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ seqtk ΠΎΡ‚ командния Ρ€Π΅Π΄ с Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ ΠΌΠΎΠ΄ΡƒΠ» WebAssembly.

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

ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° Π½Π΅ сС прСнаписва seqtk Π·Π° въвСТданС Π½Π° Π½ΠΈΠ·, Π° Π½Π΅ въвСТданС Π½Π° Ρ„Π°ΠΉΠ». Π’ Ρ‚ΠΎΠ·ΠΈ случай Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΡŠΡ‚ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ сС ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ Ρ„Π°ΠΉΠ» data.fastq във Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма с ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° main() seqtk Π²ΡŠΡ€Ρ…Ρƒ Π½Π΅Π³ΠΎ.

Π•Ρ‚ΠΎ я Π½ΠΎΠ²Π°Ρ‚Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°:

Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

Π€ΠΈΠ³ΡƒΡ€Π°Ρ‚Π° ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ вмСсто Π΄Π° изчисли Π² основната нишка Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, Ρ‚ΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡƒΠ΅Π±Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ†ΠΈ. Π’ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄Π°Π²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ изчислСния във Ρ„ΠΎΠ½ΠΎΠ²Π° нишка, Π±Π΅Π· Π΄Π° сС влошава рСакцията Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°. Π•, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΡŠΡ‚ WebWorker стартира Worker, управлявайки взаимодСйствиСто ΠΌΡƒ с основната нишка.

ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° seqtk сС изпълнява с Worker Π½Π° ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°Π½ Ρ„Π°ΠΉΠ». Π‘Π»Π΅Π΄ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π Π°Π±ΠΎΡ‚Π½ΠΈΠΊΡŠΡ‚ ΠΈΠ·Π΄Π°Π²Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅. ΠšΠΎΠ³Π°Ρ‚ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ бъдС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΎΡ‚ основната нишка, Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈΡ‚Π΅. И Ρ‚Π°ΠΊΠ° Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ Π² ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° няколко повторСния.

Какво Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π·Π° производитСлността Π½Π° WebAssembly?

Π—Π° Π΄Π° сС ΠΎΡ†Π΅Π½ΠΈ промяната Π² производитСлността, Π΅ΠΊΠΈΠΏΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π·Π° сСкунда. Π’Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ‡Π΅Ρ€Ρ‚Π°Π½Π΅ Π½Π΅ сС Π²Π·Π΅ΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ JavaScript сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ Π² Π΄Π²Π΅Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π³ΠΎΡ‚ΠΎΠ²ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° производитСлността бСшС Π΄Π΅Π²Π΅Ρ‚ ΠΏΡŠΡ‚ΠΈ.

Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

Π’ΠΎΠ²Π° Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, Π½ΠΎ, ΠΊΠ°ΠΊΡ‚ΠΎ сС ΠΎΠΊΠ°Π·Π°, ΠΈΠΌΠ° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° сС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°. Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ голям Π±Ρ€ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΎΡ‚ QC Π°Π½Π°Π»ΠΈΠ·ΠΈ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΎΡ‚ seqtk, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ. Ако Ρ‚ΠΎΠ²Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ, Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅ 13 ΠΏΡŠΡ‚ΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡŠΡ€, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π² JS.

Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

Π’ΠΎΠ²Π° бСшС постигнато Ρ‡Ρ€Π΅Π· просто ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ printf().

Но Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ всичко. Π’ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π΅, Ρ‡Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ Π΅Ρ‚Π°ΠΏ fastq.bio ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° C. Всяка ΠΎΡ‚ тях изчислява свой собствСн Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ характСристики, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всСки Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° Π΄Π° бъдС ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ Π΄Π²Π° ΠΏΡŠΡ‚ΠΈ.

Π—Π° Π΄Π° сС ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, бСшС Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄Π²Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π° сС ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚ Π² Π΅Π΄Π½Π°. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° производитСлността сС ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° 20 ΠΏΡŠΡ‚ΠΈ.

Как ускорихмС ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 20 ΠΏΡŠΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° WebAssembly

Врябва Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚Π°ΠΊΡŠΠ² ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π΅Π½ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС постигнат. Π’ някои случаи производитСлността ΠΏΠ°Π΄Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ си струва Π΄Π° ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅ всСки ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ случай.

ΠšΠ°Ρ‚ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ Wasm прСдоставя Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° подобряванС Π½Π° производитСлността Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π½ΠΎ трябва Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ.

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°:

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€