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 ( ) aswan ruway-sensibles ruwanakunapi. Llakikuypaq, achka hatun arquitectura tanteayninrayku, JavaScript mana aswan facilchu ruwan benchmarking. (ツ) mayk'aq mana kananchu tiyan? ¿Imataq JavaScript nisqawan mana allinchu? JIT Compiladorqa Chiqap kaynintam pisiyachin(?) . 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— tinkinku. askha patakuna “compiladorkuna” kaqwan 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 “ ” hina sumaq programacion simikunata ruwanku, ichaqa qamta khuyapayasqayki chaymanta kaypi chaymanta mana rimasaqchu. monomorfismo de función Hinaptinqa... ¿imaraykutaq kayqa benchmarking nisqapaqqa? Bueno, imaynachus adivinarqanki, imaraykuchus benchmarking tupuchkan 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. ruwayta 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 :). Motorkunaqa tukuy atisqankutan ruwanku allinta tiempochakunaykipaq Ya yachanki huella digital? Arí, JavaScript motorkuna tukuy atisqankuta ruwachkanku chayta pisiyachinankupaq. Kay kallpachakuy, huk kuyuywan kuska 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. ¿ Mana qatipayta yanapanapaq técnica nisqawan yanapachikuq ? pacha ataques Llakikuypaq, kayqa niyta munan, mana imakunatapas tweaking, benchmarks kaqlla sasachakuyniyuq. Ñawpaq rakipi ejemploqa manam chiqapchu kanqa, milisegundowanlla tupusqanrayku. Kunanqa, chayta tikray kaqpaq. Hatun. performance.now() 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, 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. wakin umalliqkunata yapaykusun, 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. Sapa Pachamamanchikmi hukniray 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 , iskayninku V8 JavaScript motorta llamk'achirqanku (Chrome kaqpi kikin). Bun aswanpas JavaScriptCore llamk'achin, Safari kaqpi motor, mayqinchus tukuymanta wak ruway ruwanakunayuq. Bun-ta Deno 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 nisqawan tupachiyta kallpachakuy. Kunanqa, Node.js utaq Deno nisqapi kaqllata ruway. Kayman rikch'akuq pantayta chaskinayki tiyan: factorial(100000) function factorial(i, num = 1) { ^ RangeError: Maximum call stack size exceeded V8 kaqpi (hinallataq Node.js chaymanta Deno mast'ariywan), sapa kuti 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: factorial() 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 hina churayta qhaway ; paykunaqa sinchi hukniray ruwayniyuqmi kanku. Hermes Menciones Honorables nisqa Basura huñuq hinaspa tukuy imata mana yuyaypi sayachinanpaq tendencian. JIT compiladorpa atiynin llapa codigoyki qulluy imaraykuchus “mana necesariochu”. Manchay ancho nina graficokuna aswan JavaScript dev yanapakuykunapi. Yuyaykuni chayta entiendesqaykita. Hinaptinqa... ¿Imataq Solución? 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. 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. d8 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 subdocumentado kachkan. Sapanchasqa patakunata atichiyta atikunki , ichaqa mana segurochu kani hayk'a pantay allichay willayta kutichiyta atikunki. Bun wakin yanapakuq churan , ichaqa Node.js kaqman rikch'akuq limitasqa kanku. llumpay kamachiy chiru banderankuwan benchmarking yanapakuykunatapas Llakikuypaq, tukuy kayqa motorpa base motor/prueba versión nisqatam munan, chaymi ancha sasa tariy kanman. Tarirqanim aswan sasallawan motorkunata kamachinapaq 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. esvu eshost-cli Sichus huk motorta sapanchasqa akllanakunawan tupachiyta munanki aswan chiqan atikuq hina servidorpi, kanmi mana estantemanta Node.js yanapakuykuna 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. mitata 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 kaqmanta kanqa , mayqinkunachus básica nina grafico chaymanta CPU pisiyachiy simulación yanapakuykunata qunku. Chrome devtools Conclusion 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.