astăzi introducem o nouă suită de testare WebKit JavaScript benchmark, JetStream. JetStream codifică ceea ce a fost procesul nostru de facto — pentru a combina reperele de latență și de transfer cu o ponderare aproximativ egală și pentru a capta atât valorile stilurilor tradiționale de programare JavaScript, cât și noile tehnologii bazate pe JavaScript care ne-au capturat imaginația. Scorurile pe JetStream sunt un bun indicator al performanței pe care utilizatorii le-ar vedea în aplicațiile web avansate, cum ar fi jocurile.
optimizarea performanței motorului nostru JavaScript este o prioritate ridicată pentru proiectul WebKit. Exemple ale unor îmbunătățiri pe care le-am introdus în ultimul an includ compilarea concurentă, GC generațional și JIT FTL. Ingineria unor astfel de îmbunătățiri necesită concentrare: încercăm să acordăm prioritate proiectelor cu impact ridicat asupra construirii și menținerii optimizărilor complexe care au beneficii mai mici. Astfel, motivăm munca de performanță cu repere care ilustrează tipurile de sarcini de lucru pe care utilizatorii WebKit le vor întâlni probabil. Această filozofie a dezvoltării bazate pe benchmark a făcut mult timp parte din WebKit.
starea anterioară de Benchmarking JavaScript
pe măsură ce am făcut îmbunătățiri la motorul JavaScript WebKit, am constatat că nici o singură suită de referință nu a fost în întregime reprezentativă pentru scenariile pe care am vrut să le îmbunătățim. Ne place că JSBench măsoară performanța codului JavaScript pe site-urile web populare, dar WebKit se descurcă deja foarte bine în acest punct de referință. Ne place SunSpider pentru acoperirea construcțiilor de limbaj utilizate în mod obișnuit și pentru faptul că timpul său de funcționare este reprezentativ pentru timpul de funcționare al codului de pe web, dar este scurt pentru măsurarea debitului maxim. Ne place octanul, dar se înclină prea mult în cealaltă direcție: este util pentru determinarea capacității maxime a motorului nostru, dar nu este suficient de sensibil la performanța pe care ați fi cel mai probabil să o vedeți pe sarcinile de lucru tipice web. De asemenea, minimizează noile tehnologii JavaScript precum asm.js; doar unul dintre cele 15 repere ale lui Octane a fost un asm.testul js, iar acest test ignoră performanța în virgulă mobilă.
găsirea bun asm.repere js este dificil. Chiar dacă Emscripten câștigă mindshare, testele sale sunt de lungă durată și, până de curând, nu aveau un ham web. Așa că ne-am construit propriul asm.valori de referință js utilizând teste din suita de testare LLVM. Aceste teste C și C++ sunt utilizate de dezvoltatorii LLVM pentru a urmări îmbunătățirile de performanță ale stivei compilatorului zăngănit/LLVM. Emscripten în sine folosește LLVM pentru a genera cod JavaScript. Acest lucru face ca LLVM test suite să fie deosebit de adecvat pentru a testa cât de bine un motor JavaScript gestionează codul nativ. Un alt beneficiu al noilor noastre teste este că acestea sunt mult mai rapid pentru a rula decât suita de testare Emscripten.
a avea repere JavaScript bune ne permite să urmărim cu încredere îmbunătățiri ambițioase ale WebKit. De exemplu, SunSpider ne-a ghidat munca de compilare concurentă, în timp ce asm.testele js și testele de transfer ale lui Octane au motivat munca noastră pe JIT FTL. Dar permiterea testării noastre să se bazeze pe o amestecătură a acestor apartamente de referință diferite a devenit impracticabilă. Este dificil să le spui contribuitorilor ce ar trebui să testeze dacă nu există o suită de teste unificată care să le poată spune dacă modificarea lor a avut efectul dorit asupra performanței. Vrem o suită de teste care să poată raporta un scor în cele din urmă și dorim ca acest scor să fie reprezentativ pentru direcția viitoare a WebKit.
proiectarea noii Suite Jetstream Benchmark
diferitele componente WebKit necesită abordări diferite pentru măsurarea performanței. De exemplu, pentru performanța DOM, tocmai am introdus reperul vitezometrului. În unele cazuri, abordarea evidentă funcționează destul de bine: de exemplu, multe optimizări de aspect și redare pot fi determinate prin măsurarea timpului de încărcare a paginii pe paginile web reprezentative. Dar măsurarea performanței unei implementări a limbajului de programare necesită mai multă subtilitate. Vrem să creștem sensibilitatea reperelor la îmbunătățirile motorului de bază, dar nu atât de mult încât să pierdem perspectiva asupra modului în care aceste îmbunătățiri ale motorului se joacă pe site-urile web reale. Vrem să minimizăm oportunitățile pentru zgomotul sistemului de a arunca măsurătorile noastre, dar oricând un volum de muncă este inerent predispus la zgomot, vrem un punct de referință care să arate acest lucru. Dorim ca reperele noastre să reprezinte o aproximare de înaltă fidelitate a sarcinilor de lucru de care este probabil să le pese utilizatorii WebKit.
JetStream combină o varietate de repere JavaScript, acoperind o varietate de sarcini de lucru avansate și tehnici de programare și raportează un singur scor care le echilibrează folosind o medie geometrică. Fiecare test este rulat de trei ori și scorurile sunt raportate cu intervale de încredere de 95%. Fiecare benchmark măsoară un volum de muncă distinct și nicio tehnică de optimizare unică nu este suficientă pentru a accelera toate benchmark-urile. Unele repere demonstrează compromisuri, iar optimizarea agresivă sau specializată pentru un punct de referință ar putea face un alt punct de referință mai lent. Demonstrarea compromisurilor este crucială pentru munca noastră. Așa cum am discutat în postarea mea anterioară despre noul nostru compilator JIT, WebKit încearcă să se adapteze dinamic la volumul de muncă folosind diferite niveluri de execuție. Dar acest lucru nu este niciodată perfect. De exemplu, în timp ce noul nostru compilator FTL JIT ne oferă viteze fantastice la testele de vârf, provoacă ușoare regresii în unele teste ramp-up. Noile optimizări pentru runtime-urile avansate de limbă se confruntă adesea cu astfel de compromisuri, iar obiectivul nostru cu JetStream este să avem un punct de referință care să ne informeze despre compromisurile pe care le facem.
JetStream include repere din suitele de referință JavaScript SunSpider 1.0.2 și Octane 2. De asemenea, include repere din proiectul open source al compilatorului LLVM, compilat în JavaScript folosind Emscripten 1.13. De asemenea, include un punct de referință bazat pe HashMap-ul proiectului Apache Harmony open source, tradus manual în JavaScript. Mai multe informații despre reperele incluse în JetStream sunt disponibile pe pagina JetStream In Depth.
suntem încântați să introducem acest nou punct de referință. Pentru a rula, pur și simplu vizitați browserbench.org/JetStream. puteți depune bug-uri împotriva benchmark-ului folosind sistemul de gestionare a erorilor WebKit sub componenta instrumente/teste.