Chiqnikuni benchmarking código, mayqin runa hina (mayqinchus, kaypi, kaymanta aswan qhawaqkuna mana ̄\ (ツ) / ̄chu kanku). Aswan kusikuymi huk chaninpa waqaychasqayki ruwayta 1000% yapasqa hina ruway aswan prueba ruwaymanta ima ruwasqan qhawanapaq. Ay, JavaScript kaqpi tupachiyqa necesarioraq, aswanta JavaScript llamk'achisqa kasqanrayku ( mayk'aq mana kananchu tiyan? ) aswan ruway-sensibles ruwanakunapi. Llakikuypaq, achka hatun arquitectura tanteayninrayku, JavaScript mana aswan facilchu ruwan benchmarking.
Pikunachus mana yachankuchu kunan pacha scripting simikunap layqakuyninwan JavaScript hina, paykunap arquitecturanku ancha sasachakuyniyuq kanman. Huk t'ikraq kaqnintakamalla codigo purichiymantaqa chaymanta chaylla kamachiykunata thuqan, aswan JavaScript motorkuna huk arquitectura aswan rikch'akuq huk huñusqa simiman C hina llamk'achinku— askha patakuna “compiladorkuna” kaqwan tinkinku.
Sapa kay huñuqkuna huk chikan rantinakuy qun huñuna pachawan puriy pacha ruwaywan, chayrayku llamk'achiq mana yupay allinchay codigota gastayta munanchu mayqinchus pisilla purichisqa aswan ñawpaq huñuqpa ruwaynin allinninkunata aprovechaspa aswan sapa kuti purichisqa codigopaq ( chay “ruphay ñankuna”). Hinallataq kan wakin huk sasachakuykuna mayqinkunachus rikhurinku mayk’aqchus compiladores optimizadores kaqwan llamk’achkanku mayqinkunachus “ monomorfismo de función ” hina sumaq programacion simikunata ruwanku, ichaqa qamta khuyapayasqayki chaymanta kaypi chaymanta mana rimasaqchu.
Hinaptinqa... ¿imaraykutaq kayqa benchmarking nisqapaqqa? Bueno, imaynachus adivinarqanki, imaraykuchus benchmarking tupuchkan ruwayta codigomanta, JIT compilador huk allin hatun influenciayuq kayta atin. Aswan huch'uy codigokuna, benchmark kaqpi, sapa kuti 10x+ ruway allinchayta rikunkuman hunt'asqa allinchaymanta qhipaman, achka pantayta ruwasqakunaman riqsichispa.
Ejemplopaq, aswan básica benchmarking churayniykipi (Ama imatapas uraypi hina llamk'achiychu achka razonkunarayku):
for (int i = 0; i<1000; i++) { console.time() // do some expensive work console.timeEnd() }
(Ama llakikuychu, console.time
rimasunmi )
Achka codigoyki huk pisi pruebakuna qhipaman waqaychasqa kanqa, sapa llamkana pachata anchata pisiyachispa. Benchmark programakuna sapa kuti tukuy atisqankuta ruwanku kay caching/optimización chinkachinankupaq, imaynachus ruwayta atintaq programakuna pruebasqa qhipaman benchmark ruwaypi aswan utqaylla rikhurinankupaq. Ichaqa, qhipaman tapunayki tiyan sichus mana allinchayniyuq benchmarkkuna chiqa pachapi ruwaywan tupan.
Chiqamanta, wakin casokunapi, mana sapa kuti yaykuyniyuq web p'anqakuna hina, allinchayqa mana chaninchu, ichaqa servidorkuna hina pachakunapi, maypi ruway aswan chaniyuq, allinchay suyakunan tiyan. Sichus huk pedazo código middleware hina waranqa waranqa mañakuykunapaq huk segundo kaqpi purichichkanki, aswan allin suyakunki V8 chayta allinchachkan.
Chaymi básicamente, huk motor ukhupipas, 2-4 hukniray ñankuna kanku códigoyki purichiypaq hukniray hukniray nivelkuna ruwaywan. Oh, hinallataq, mana iñiy atina sasa wakin casokunapi wakin allinchay nivelkuna atichisqa kasqankuta qhaway. Kusirikuy :).
Ya yachanki huella digital? ¿ Mana qatipayta yanapanapaq técnica nisqawan yanapachikuq ? Arí, JavaScript motorkuna tukuy atisqankuta ruwachkanku chayta pisiyachinankupaq. Kay kallpachakuy, huk kuyuywan kuska pacha ataques hark'anapaq , JavaScript motorkuna munaspa pacha mana chiqan kaqta ruwanankupaq pusarqa, chayrayku hackers mana chiqan tupuykunata kunan computadorakunap ruwayninmanta utaq mayk'a chaninniyuq huk llamk'ay kasqanmanta.
Llakikuypaq, kayqa niyta munan, mana imakunatapas tweaking, benchmarks kaqlla sasachakuyniyuq.
Ñawpaq rakipi ejemploqa manam chiqapchu kanqa, milisegundowanlla tupusqanrayku. Kunanqa, chayta tikray performance.now()
kaqpaq. Hatun.
Kunanqa, microsegundokunapi pacha sellokunata kapuwanchik!
// Bad console.time(); // work console.timeEnd(); // Better? const t = performance.now(); // work console.log(performance.now() - t);
Salvo... llapanku 100μs yapasqakunapi kachkanku. Kunanqa, wakin umalliqkunata yapaykusun, pacha ataquekuna riesgota pisiyachinapaq. Ay, kunankamapas 5μs yapayllatam atinchik. 5μs ichapas suficiente precisión achka casos de uso kaqpaq, ichaqa huklawpi maskanayki kanqa imapas aswan granularidadta mañakuq. Yachasqayman hinaqa, manam mayqin navegadorpas aswan granular pachakunata saqinchu. Node.js ruwan, ichaqa chiqamanta, chay kikin sasachakuyniyuq.
Navegador kaqnintakama codigoyki purichiyta tanteaspaykipas chaymanta compiladorpa ruwayninta saqispapas, sut'imanta, aswan uma nanayniyuqraqmi kanki sichus chiqap pachata munanki. Oh arí, hinaspa mana llapan navegadorkunachu kaqlla ruwasqa kanku.
Bun-ta munakuni imatachus ruwasqanmanta JavaScript servidor-ladopi ñawpaqman tanqananpaq, ichaqa dang, JavaScript benchmarking servidorkunapaq aswan sasa ruwan. Iskay kimsa wata ñawpaqta, sapalla servidor-lado JavaScript muyuriqkunamanta runakuna llakisqa karqanku Node.js chaymanta Deno , iskayninku V8 JavaScript motorta llamk'achirqanku (Chrome kaqpi kikin). Bun aswanpas JavaScriptCore llamk'achin, Safari kaqpi motor, mayqinchus tukuymanta wak ruway ruwanakunayuq.
Kay sasachakuy achka JavaScript muyuriqkunamanta kikin ruwayniyuq kayninkuwan aswan musuq kachkan servidor-ladopi JavaScript kaqpi ichaqa unay pachamanta clientekunata ñak'arichisqa. 3 hukniray sapa kuti llamk'achisqa JavaScript motorkuna, V8, JSC, chaymanta SpiderMonkey Chrome, Safari chaymanta Firefox kaqpaq, sapakama, tukuyninku ancha utqaylla utaq aswan pisilla ruwayta atinku huk kaqlla codigo kaqpi.
Huk rikch'anachiy kay chiqan kaykunamanta kanku kay Tail Call Optimization (TCO) kaqpi. TCO allinchan ruwaykunata kurku tukukuyninpi kutimuq, kayhina:
function factorial(i, num = 1) { if (i == 1) return num; num *= i; i--; return factorial(i, num); }
Bun nisqapi factorial(100000)
nisqawan tupachiyta kallpachakuy. Kunanqa, Node.js utaq Deno nisqapi kaqllata ruway. Kayman rikch'akuq pantayta chaskinayki tiyan:
function factorial(i, num = 1) { ^ RangeError: Maximum call stack size exceeded
V8 kaqpi (hinallataq Node.js chaymanta Deno mast'ariywan), sapa kuti factorial()
tukukuypi waqyakun, motor huk tukuy musuq ruwana contextota ruwan anidado ruwana purinanpaq, mayqinchus qhipaman waqyay pila kaqwan limitasqa. Ichaqa, ¿imaraykutaq mana Bun llaqtapichu kayqa pasakun? JavaScriptCore, mayqinchus Bun llamk'achin, TCO ruwan, mayqinchus kay laya ruwanakunata allinchan huk for loop kaqman aswan kayhinata tikraspa:
function factorial(i, num = 1) { while (i != 1) { num *= i; i--; } return i; }
Mana hawa ruwayllachu waqyay pila limitekunata hark'an, ichaqa aswan utqayllataqmi imaraykuchus mana ima musuq ruwana contextokuna mañanchu, niyta munan ruwanakuna hawapi hina ruwanakuna ancha huknirayta huk motorkuna urapi benchmark ruwanqa.
Aswanta, kay chiqan kay niyta munanlla tukuy motorkunapura benchmark ruwanayki tiyan mayqinkunatachus suyanki codigoyki purichiyta codigo hukpi usqhayta mana wakpi llasaq kaqta qhawanaykipaq. Hinallataq, sichus huk bibliotecata ruwachkanki mayqinchus achka plataformakunapi llamk'achiyta suyachkanki, aswan esotérico motorkuna Hermes hina churayta qhaway ; paykunaqa sinchi hukniray ruwayniyuqmi kanku.
Munaymanmi huk npm paquete nisqaman señalayta, chaymi llapa kay sasachakuykunata allichan, ichaqa chiqaptaqa manam hukpas kanchu.
Servidor kaqpi, huk pisi aswan facil pachayuq kanki. d8 llamk'achiy atikunki makiwan allinchay patakunata kamachinaykipaq, basura huñuqta kamachinaykipaq chaymanta chiqan pachata tarinaykipaq. Chiqamanta, wakin Bash-fu necesitanki huk allin ruwasqa benchmark pipeline kaypaq churanaykipaq, llakikuypaq, d8 mana allintachu tinkisqa (utaq hukllachasqachu) Node.js kaqwan.
Wakin banderakunatapas Node.js kaqpi atichiyta atikunki rikch'aq ruwaykunata tarinapaq, ichaqa ruwanakunata pantanki imaynachus sapanchasqa allinchay patakuna atichiy.
v8 --sparkplug --always-sparkplug --no-opt [file]
D8 kaqmanta huk rikch'ana huk específico huñuna patawan (bujía) atichisqa. D8, ñawpaqmanta, aswan kamachiy GC kaqmanta chaymanta aswan pantay allichay info kaqmanta tukuypaq.
JavaScriptCore nisqapi wakin rikch'aq ruwaykunata tariyta atinki??? Honestamente, mana anchatachu JavaScriptCore kaqpa CLI kaqninta llamk'achirqani, chaymanta llumpay subdocumentado kachkan. Sapanchasqa patakunata kamachiy chiru banderankuwan atichiyta atikunki , ichaqa mana segurochu kani hayk'a pantay allichay willayta kutichiyta atikunki. Bun wakin yanapakuq benchmarking yanapakuykunatapas churan , ichaqa Node.js kaqman rikch'akuq limitasqa kanku.
Llakikuypaq, tukuy kayqa motorpa base motor/prueba versión nisqatam munan, chaymi ancha sasa tariy kanman. Tarirqanim aswan sasallawan motorkunata kamachinapaq esvu eshost-cli nisqawan tupachisqa kasqanmanta, imaynam paykuna kuska motorkunata kamachiyta hinaspa paykunapa chawpinpi código purichiyta ancha facilta ruwanku. Chiqamanta, kunankamapas achka makiwan llamk'ay mañasqa kachkan, imaynachus kay yanapakuykuna hukniray motorkunapi purichiy codigota kamachinkuraq —hinallataq qam kikiyki benchmarking codigo qillqanayki tiyan.
Sichus huk motorta sapanchasqa akllanakunawan tupachiyta munanki aswan chiqan atikuq hina servidorpi, kanmi mana estantemanta Node.js yanapakuykuna mitata hina chaymanta yanapakunku allinchayta pacha chiqan kayta chaymanta GC-wan tupaq pantaykunata. Achka kay yanapakuykuna, Mitata hina, achka motorkunapipas llamk'achiy atikunmi; chiqapmi, chay hawapi hina gasoductotaqa churanaykiraqmi kanqa.
Navegador kaqpi, tukuy imapas aswan sasa. Manam yachanichu ima soluciontapas aswan preciso tiempopaq, chaymanta control motorpa aswan limitasqa. Aswan willayta tariyta atikunki puriy pacha JavaScript ruwaywan tinkisqa maskaqpi Chrome devtools kaqmanta kanqa , mayqinkunachus básica nina grafico chaymanta CPU pisiyachiy simulación yanapakuykunata qunku.
Askha kikin diseño decisionkuna JavaScript (relativamente) ruwaq chaymanta apaykachanapaq ruwasqa, benchmarking ruwayta aswan sasata ruwan wak simikunamanta. Aswan achka metakuna kanku benchmark ruwanapaq, chaymanta aswan pisi controlniyuq kanki sapa meta kaqpi.
Munaymanmi huk allichay huk punchaw achka kay sasachakuykunata pisiyachinanta. Ichapas qhipaman huk yanapakuyta ruwasaq cruzada motor chaymanta compilación nivel benchmarking pisiyachinapaq, ichaqa kunankama, huk pipeline ruway llapa kay sasachakuykunata allichanapaq allin llamk'ayta hapin. Chiqamanta, ancha allinmi yuyariy kay sasachakuykuna mana llapa runapaqchu —sichus códigoyki huk muyuriqllapi purichkan, ama pachaykita usuchiychu wak muyuriqkunawan tupachiypi.
Imaynatapas benchmark ruwayta akllanki, suyachkani kay qillqasqa wakin sasachakuykuna JavaScript benchmarking kaqpi kaqta rikuchisurqanki. Yachachiway sichus huk yachachiy wakin imakuna hawapi willasqaykunata implementanapaq yanapanman.