වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

ජාවාස්ක්‍රිප්ට් ගණනය කිරීම් WebAssembly සමඟ ප්‍රතිස්ථාපනය කිරීමෙන් බ්‍රවුසර යෙදුමක් වේගවත් කිරීම සඳහා මෙම ලිපිය සාකච්ඡා කරයි.

WebAssembly - එය කුමක්ද?

කෙටියෙන් කිවහොත්, මෙය stack-based virtual machine සඳහා ද්විමය උපදෙස් ආකෘතියකි. Wasm (කෙටි නම) බොහෝ විට ක්රමලේඛන භාෂාවක් ලෙස හැඳින්වේ, නමුත් එය එසේ නොවේ. උපදෙස් ආකෘතිය JavaScript සමඟ බ්‍රවුසරයේ ක්‍රියාත්මක වේ.

C/C++, Rust, Go වැනි භාෂාවලින් මූලාශ්‍ර සම්පාදනය කිරීමෙන් WebAssembly ලබා ගත හැකි වීම වැදගත් වේ. මෙහිදී සංඛ්යානමය ටයිප් කිරීම සහ ඊනියා පැතලි මතක ආකෘතිය භාවිතා වේ. ඉහත සඳහන් කළ පරිදි, කේතය සංයුක්ත ද්විමය ආකෘතියකින් ගබඩා කර ඇති අතර, එය විධාන රේඛාව භාවිතයෙන් යෙදුම ධාවනය කරන තරමටම වේගවත් කරයි. මෙම හැකියාවන් WebAssembly හි ජනප්‍රියතාවයේ වර්ධනයට හේතු වී ඇත.

අපි ඔබට මතක් කරමු: "Habr" හි සියලුම පාඨකයින් සඳහා - "Habr" ප්‍රවර්ධන කේතය භාවිතයෙන් ඕනෑම Skillbox පාඨමාලාවකට ලියාපදිංචි වන විට රූබල් 10 ක වට්ටමක්.

Skillbox නිර්දේශ කරයි: ප්රායෝගික පාඨමාලාව "ජංගම සංවර්ධක PRO".

දැනට, ඩූම් 3 වැනි ක්‍රීඩාවල සිට ඔටෝකැඩ් සහ ෆිග්මා වැනි වෙබ්-පෝට් කරන ලද යෙදුම් දක්වා බොහෝ යෙදුම්වල Wasm භාවිතා වේ. සේවාදායකය රහිත පරිගණකකරණය වැනි ක්ෂේත්‍රවල ද Wasm භාවිතා වේ.

මෙම ලිපිය විශ්ලේෂණ වෙබ් සේවාවක් වේගවත් කිරීම සඳහා Wasm භාවිතා කිරීම පිළිබඳ උදාහරණයක් සපයයි. පැහැදිලිකම සඳහා, අපි C අකුරින් ලියා ඇති, WebAssembly වෙත සම්පාදනය කරන ලද ක්‍රියාකාරී යෙදුමක් ගත්තෙමු. JS හි අඩු ක්‍රියාකාරී කොටස් ප්‍රතිස්ථාපනය කිරීමට ප්‍රතිඵලය භාවිතා කරනු ඇත.

යෙදුම් පරිවර්තනය

උදාහරණය ජාන විද්‍යාඥයින් සඳහා අදහස් කරන fastq.bio බ්‍රවුසර සේවාව භාවිතා කරනු ඇත. ඩීඑන්ඒ අනුපිළිවෙලෙහි (අවබෝධනය) ගුණාත්මකභාවය ඇගයීමට මෙවලම ඔබට ඉඩ සලසයි.

ක්‍රියාත්මක වන යෙදුමේ උදාහරණයක් මෙන්න:

වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

ක්‍රියාවලියේ විස්තර විශේෂඥයන් නොවන අය සඳහා බෙහෙවින් සංකීර්ණ වන බැවින් ඒවා තුළට යාම වටී නැත, නමුත් කෙටියෙන් කිවහොත්, විද්‍යාඥයින්ට DNA අනුක්‍රමික ක්‍රියාවලිය සුමටව සිදු වූයේද සහ පැන නැගුණු ගැටළු මොනවාද යන්න තේරුම් ගැනීමට ඉහත තොරතුරු විස්තරය භාවිතා කළ හැකිය.

මෙම සේවාවට විකල්ප, ඩෙස්ක්ටොප් වැඩසටහන් ඇත. නමුත් fastq.bio මඟින් දත්ත දෘශ්‍යමාන කිරීමෙන් ඔබේ කාර්යය වේගවත් කිරීමට ඔබට ඉඩ සලසයි. වෙනත් බොහෝ අවස්ථාවලදී, ඔබට විධාන රේඛාව සමඟ වැඩ කිරීමට හැකි විය යුතුය, නමුත් සියලුම ජාන විද්යාඥයින්ට අවශ්ය අත්දැකීම් නොමැත.

සෑම දෙයක්ම සරලව ක්රියා කරයි. ආදානය යනු පෙළ ගොනුවක් ආකාරයෙන් ඉදිරිපත් කරන ලද දත්ත වේ. මෙම ගොනුව විශේෂිත අනුක්‍රමික මෙවලම් මගින් ජනනය කර ඇත. ගොනුවේ DNA අනුපිළිවෙල ලැයිස්තුවක් සහ එක් එක් නියුක්ලියෝටයිඩ සඳහා ගුණාත්මක ලකුණු අඩංගු වේ. ගොනු ආකෘතිය .fastq වේ, සේවාවට එහි නම ලැබුණේ එබැවිනි.

JavaScript හි ක්‍රියාත්මක කිරීම

fastq.bio සමඟ වැඩ කරන විට පරිශීලකයාගේ පළමු පියවර වන්නේ සුදුසු ගොනුව තෝරා ගැනීමයි. ගොනු වස්තුව භාවිතයෙන්, යෙදුම ගොනුවකින් අහඹු දත්ත නියැදියක් කියවා එම කණ්ඩායම සකසයි. මෙහි JavaScript හි කාර්යය වන්නේ සරල තන්තු මෙහෙයුම් සිදු කිරීම සහ ප්‍රමිතික ගණනය කිරීමයි. ඒවායින් එකක් වන්නේ විවිධ DNA කොටස් මත ඇති A, C, G සහ T නියුක්ලියෝටයිඩ ගණනයි.

අවශ්‍ය දර්ශක ගණනය කිරීමෙන් පසුව, ඒවා Plotly.js භාවිතයෙන් දෘශ්‍යමාන කර ඇති අතර, සේවාව නව දත්ත නියැදියක් සමඟ වැඩ කිරීමට පටන් ගනී. UX හි ගුණාත්මකභාවය වැඩි දියුණු කිරීම සඳහා කුට්ටි කිරීම සිදු කෙරේ. ඔබ සියලු දත්ත සමඟ එකවර වැඩ කරන්නේ නම්, ක්‍රියාවලිය යම් කාලයක් සඳහා කැටි වනු ඇත, මන්ද අනුක්‍රමික ප්‍රතිඵල සහිත ගොනු ගිගාබයිට් සිය ගණනක් ගොනු ඉඩක් ගන්නා බැවිනි. සේවාව 0,5 සිට 1 MB දක්වා ප්‍රමාණයේ දත්ත කොටස් ලබා ගන්නා අතර ඒවා සමඟ පියවරෙන් පියවර ක්‍රියා කරමින් චිත්‍රක දත්ත ගොඩනඟයි.

එය ක්‍රියාත්මක වන්නේ මෙහෙමයි.

වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

රතු සෘජුකෝණාස්රයේ දෘශ්‍යකරණය ලබා ගැනීම සඳහා නූල් පරිවර්තන ඇල්ගොරිතම අඩංගු වේ. මෙය සේවාවේ වඩාත්ම ගණනය කිරීම් තීව්‍ර කොටසයි. එය Wasm සමඟ ප්රතිස්ථාපනය කිරීමට උත්සාහ කිරීම වටී.

WebAssembly පරීක්ෂා කිරීම

Wasm භාවිතා කිරීමේ හැකියාව තක්සේරු කිරීම සඳහා, ව්‍යාපෘති කණ්ඩායම වේගවත් ගොනු මත පදනම්ව QC ප්‍රමිතික (QC - තත්ත්ව පාලනය) නිර්මාණය කිරීම සඳහා සූදානම් කළ විසඳුම් සෙවීම ආරම්භ කළේය. C, C++ හෝ Rust වලින් ලියා ඇති මෙවලම් අතර සෙවීම සිදු කරන ලද අතර එමඟින් කේතය WebAssembly වෙත ගෙනයාමට හැකි විය. මීට අමතරව, මෙවලම "අමු" නොවිය යුතුය; විද්යාඥයින් විසින් දැනටමත් පරීක්ෂා කර ඇති සේවාවක් අවශ්ය විය.

එහි ප්රතිඵලයක් වශයෙන්, තේරීම පක්ෂව සිදු කරන ලදී seqtk. යෙදුම බෙහෙවින් ජනප්රියයි, එය විවෘත මූලාශ්ර වේ, මූලාශ්ර භාෂාව C වේ.

Wasm බවට පරිවර්තනය කිරීමට පෙර, ඩෙස්ක්ටොප් සඳහා seqtk හි සම්පාදන මූලධර්මය දෙස බැලීම වටී. Makefile වලට අනුව, ඔබට අවශ්‍ය දේ මෙන්න:

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

ප්‍රතිපත්තිමය වශයෙන්, ඔබට Emscripten භාවිතයෙන් seqtk සම්පාදනය කළ හැක. එය නොමැති නම්, අපි කරන්නෙමු. ඩොකර් රූපය.

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

අපේක්ෂිත නම් ඔබට එය ඔබම එකලස් කළ හැකිය, නමුත් එය කාලය ගත වේ.

කන්ටේනරයක් තුළ, ඔබට පහසුවෙන් gcc සඳහා විකල්පයක් ලෙස emcc භාවිතා කළ හැකිය:

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

අවම වෙනස්කම්:

ද්විමය ගොනුවකට ප්‍රතිදානය කරනවා වෙනුවට, WebAssemby මොඩියුලය ක්‍රියාත්මක කිරීමට භාවිතා කරන ගොනු උත්පාදනය කිරීමට Emscripten .wasm සහ .js භාවිතා කරයි.

USE_ZLIB ධජය zlib පුස්තකාලයට සහය වීමට භාවිතා කරයි. පුස්තකාලය WebAssembly වෙත බෙදා හැර ඇති අතර, Emscripten එය ව්‍යාපෘතියට ඇතුළත් කර ඇත.

Emscrippten අතථ්‍ය ගොනු පද්ධතිය සක්‍රිය කර ඇත. මෙය POSIX වැනි FS, බ්‍රවුසරය තුළ RAM හි ධාවනය වේ. පිටුව නැවුම් කළ විට, මතකය ඉවත් වේ.

අතථ්‍ය ගොනු පද්ධතියක් අවශ්‍ය වන්නේ මන්දැයි තේරුම් ගැනීමට, ඔබ විධාන රේඛාවෙන් seqtk ධාවනය කරන ආකාරය සහ ඔබ සම්පාදනය කරන ලද WebAssembly මොඩියුලයක් ධාවනය කරන ආකාරය සංසන්දනය කිරීම වටී.

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

අථත්‍ය ගොනු පද්ධතියට ප්‍රවේශය ලබා ගැනීම අවශ්‍ය වන්නේ ගොනු ආදානයට වඩා string සඳහා seqtk නැවත ලිවීමට නොවේ. මෙම අවස්ථාවෙහිදී, දත්ත ඛණ්ඩනය අථත්‍ය FS හි data.fastq ගොනුවක් ලෙස ප්‍රධාන () seqtk වෙත ඇමතුමක් සමඟ පෙන්වනු ලැබේ.

මෙන්න නව ගෘහ නිර්මාණ ශිල්පය:

වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

රූපයේ දැක්වෙන්නේ ප්‍රධාන බ්‍රවුසර නූල් වල ගණනය කිරීම් වෙනුවට, වෙබ් වැඩ කරන්නන්. මෙම ක්‍රමය මඟින් බ්‍රවුසර ප්‍රතිචාරයට බලපෑමක් නොකර පසුබිම් නූලක ගණනය කිරීම් සිදු කිරීමට ඔබට ඉඩ සලසයි. හොඳයි, WebWorker පාලකය ප්‍රධාන නූල් සමඟ එහි අන්තර්ක්‍රියා කළමනාකරණය කරමින් සේවකයා ආරම්භ කරයි.

seqtk විධානය ක්‍රියාත්මක වන්නේ සවිකර ඇති ගොනුවේ Worker භාවිතා කරමිනි. ක්රියාත්මක කිරීම අවසන් වූ පසු, සේවකයා පොරොන්දුවක ස්වරූපයෙන් ප්රතිඵලයක් ලබා දෙයි. ප්‍රධාන නූලට පණිවිඩයක් ලැබුණු විට, ප්‍රස්ථාර යාවත්කාලීන කිරීමට ප්‍රතිඵලය භාවිතා කරයි. සහ එසේ පුනරාවර්තන කිහිපයකින්.

WebAssembly කාර්ය සාධනය ගැන කුමක් කිව හැකිද?

කාර්ය සාධනයේ වෙනස තක්සේරු කිරීම සඳහා, ව්‍යාපෘති කණ්ඩායම තත්පර පරාමිතියකට කියවීමේ මෙහෙයුම් භාවිතා කළේය. ක්‍රියාත්මක කිරීම් දෙකම JavaScript භාවිතා කරන බැවින් අන්තර්ක්‍රියාකාරී ප්‍රස්ථාර තැනීමට ගතවන කාලය සැලකිල්ලට නොගනී.

කොටුවෙන් පිටත විසඳුම භාවිතා කරන විට, කාර්ය සාධනය වැඩිවීම නව ගුණයක් විය.

වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

මෙය විශිෂ්ට ප්රතිඵලයකි, නමුත්, එය පෙනෙන පරිදි, එය ද ප්රශස්ත කිරීමට අවස්ථාවක් තිබේ. කාරණය වන්නේ QC විශ්ලේෂණ ප්රතිඵල විශාල සංඛ්යාවක් seqtk විසින් භාවිතා නොකෙරේ, එබැවින් ඒවා මකා දැමිය හැකිය. ඔබ මෙය කරන්නේ නම්, JS හා සසඳන විට ප්රතිඵලය 13 ගුණයකින් වැඩි වේ.

වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

එය හුදෙක් printf() විධානයන් අදහස් දැක්වීමෙන් සාක්ෂාත් කර ගන්නා ලදී.

නමුත් එය පමණක් නොවේ. කාරණය නම්, මෙම අවස්ථාවෙහිදී, fastq.bio විවිධ C ශ්‍රිතයන් ඇමතීමෙන් විශ්ලේෂණ ප්‍රතිඵල ලබා ගනී.ඒ සෑම එකක්ම තමන්ගේම ලක්ෂණ සමූහයක් ගණනය කරයි, එවිට ගොනුවේ සෑම කොටසක්ම දෙවරක් කියවනු ලැබේ.

මෙම ගැටළුව මඟහරවා ගැනීම සඳහා, කාර්යයන් දෙකක් එකකට ඒකාබද්ධ කිරීමට තීරණය විය. එහි ප්රතිඵලයක් වශයෙන් ඵලදායිතාව 20 ගුණයකින් වැඩි විය.

වෙබ් යෙදුමක් 20 වතාවක් වේගවත් කිරීමට අපි WebAssembly භාවිතා කළ ආකාරය

එවන් කැපී පෙනෙන ප්රතිඵලය සෑම විටම ලබා ගත නොහැකි බව සඳහන් කිරීම වටී. සමහර අවස්ථාවලදී, කාර්ය සාධනය පහත වැටෙනු ඇත, එබැවින් එය එක් එක් සිද්ධිය ඇගයීම වටී.

අවසාන වශයෙන්, යෙදුම් කාර්ය සාධනය වැඩි දියුණු කිරීමට Wasm අවස්ථාවක් ලබා දෙන බව අපට පැවසිය හැකිය, නමුත් ඔබ එය ඥානවන්තව භාවිතා කළ යුතුය.

Skillbox නිර්දේශ කරයි:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න