Oggi stiamo introducendo una nuova WebKit JavaScript benchmark test suite, JetStream. JetStream codifica ciò che è stato il nostro processo di fatto: combinare i benchmark di latenza e throughput con una ponderazione approssimativamente uguale e catturare sia le metriche degli stili di programmazione JavaScript tradizionali che le nuove tecnologie basate su JavaScript che hanno catturato la nostra immaginazione. I punteggi su JetStream sono un buon indicatore delle prestazioni che gli utenti vedrebbero nelle applicazioni Web avanzate come i giochi.
Ottimizzare le prestazioni del nostro motore JavaScript è una priorità assoluta per il progetto WebKit. Esempi di alcuni dei miglioramenti che abbiamo introdotto nell’ultimo anno includono concurrent compilation, generational GC e FTL JIT. La progettazione di tali miglioramenti richiede attenzione: cerchiamo di dare la priorità ai progetti ad alto impatto rispetto alla costruzione e al mantenimento di ottimizzazioni complesse che hanno vantaggi minori. Pertanto, motiviamo il lavoro sulle prestazioni con benchmark che illustrano i tipi di carichi di lavoro che gli utenti di WebKit probabilmente incontreranno. Questa filosofia di sviluppo benchmark-driven è stata a lungo parte di WebKit.
Lo stato precedente del Benchmarking JavaScript
Mentre apportavamo miglioramenti al motore JavaScript di WebKit, abbiamo scoperto che nessuna singola suite di benchmark era interamente rappresentativa degli scenari che volevamo migliorare. Ci piace che JSBench misuri le prestazioni del codice JavaScript su siti Web popolari, ma WebKit fa già molto bene su questo benchmark. Ci piace SunSpider per la sua copertura dei costrutti del linguaggio comunemente usati e per il fatto che il suo tempo di esecuzione è rappresentativo del tempo di esecuzione del codice sul Web, ma non è sufficiente per misurare il throughput di picco. Ci piace Octane, ma si inclina troppo nella direzione opposta: è utile per determinare il throughput di picco del nostro motore, ma non è abbastanza sensibile alle prestazioni che avresti più probabilità di vedere sui tipici carichi di lavoro web. Minimizza anche nuove tecnologie JavaScript come asm.js; solo uno dei 15 benchmark di Octane era un asm.test js e questo test ignora le prestazioni in virgola mobile.
Trovare un buon asm.i benchmark js sono difficili. Anche se Emscripten sta guadagnando mindshare, i suoi test sono di lunga durata e fino a poco tempo, mancava un cablaggio web. Così abbiamo costruito il nostro asm.benchmark js utilizzando i test della suite di test LLVM. Questi test C e C++ vengono utilizzati dagli sviluppatori LLVM per monitorare i miglioramenti delle prestazioni dello stack di compilatori clang/LLVM. Emscripten stesso utilizza LLVM per generare codice JavaScript. Ciò rende la suite di test LLVM particolarmente appropriata per testare quanto bene un motore JavaScript gestisca il codice nativo. Un altro vantaggio dei nostri nuovi test è che sono molto più veloci da eseguire rispetto alla suite di test Emscripten.
Avere buoni benchmark JavaScript ci consente di perseguire con sicurezza ambiziosi miglioramenti a WebKit. Ad esempio, SunSpider ha guidato il nostro lavoro di compilazione concorrente, mentre l’asm.i test js e i test di throughput di Octane hanno motivato il nostro lavoro sul JIT FTL. Ma permettere ai nostri test di basarsi su un miscuglio di queste diverse suite di benchmark è diventato impraticabile. È difficile dire ai contributori cosa dovrebbero testare se non esiste una suite di test unificata che possa dire loro se il loro cambiamento ha avuto l’effetto desiderato sulle prestazioni. Vogliamo una suite di test in grado di riportare un punteggio alla fine e vogliamo che questo punteggio sia rappresentativo della direzione futura di WebKit.
Progettare la nuova JetStream Benchmark Suite
Diversi componenti WebKit richiedono approcci diversi per misurare le prestazioni. Ad esempio, per le prestazioni DOM, abbiamo appena introdotto il benchmark del tachimetro. In alcuni casi, l’approccio ovvio funziona abbastanza bene: ad esempio, molte ottimizzazioni di layout e rendering possono essere guidate misurando il tempo di caricamento delle pagine su pagine Web rappresentative. Ma misurare le prestazioni di un’implementazione del linguaggio di programmazione richiede più sottigliezza. Vogliamo aumentare la sensibilità dei benchmark ai miglioramenti del motore principale, ma non tanto da perdere la prospettiva su come questi miglioramenti del motore si svolgono nei siti Web reali. Vogliamo ridurre al minimo le opportunità per il rumore del sistema di eliminare le nostre misurazioni, ma ogni volta che un carico di lavoro è intrinsecamente soggetto a rumore, vogliamo un benchmark per mostrarlo. Vogliamo che i nostri benchmark rappresentino un’approssimazione ad alta fedeltà dei carichi di lavoro di cui gli utenti di WebKit probabilmente si preoccupano.
JetStream combina una varietà di benchmark JavaScript, che coprono una varietà di carichi di lavoro avanzati e tecniche di programmazione, e riporta un singolo punteggio che li bilancia utilizzando una media geometrica. Ogni test viene eseguito tre volte e i punteggi sono riportati con intervalli di confidenza del 95%. Ogni benchmark misura un carico di lavoro distinto e nessuna singola tecnica di ottimizzazione è sufficiente per accelerare tutti i benchmark. Alcuni benchmark dimostrano compromessi e l’ottimizzazione aggressiva o specializzata per un benchmark potrebbe rallentare un altro benchmark. Dimostrare i compromessi è fondamentale per il nostro lavoro. Come discusso nel mio precedente post sul nostro nuovo compilatore JIT, WebKit cerca di adattarsi dinamicamente al carico di lavoro utilizzando diversi livelli di esecuzione. Ma questo non è mai perfetto. Ad esempio, mentre il nostro nuovo compilatore JIT FTL ci offre fantastici speed-up sui test di throughput di picco, causa lievi regressioni in alcuni test di rampa. Le nuove ottimizzazioni per i runtime linguistici avanzati spesso incontrano tali compromessi e il nostro obiettivo con JetStream è avere un benchmark che ci informi sui compromessi che stiamo facendo.
JetStream include benchmark dalle suite di benchmark JavaScript SunSpider 1.0.2 e Octane 2. Include anche benchmark dal compilatore LLVM progetto open source, compilato in JavaScript utilizzando Emscripten 1.13. Include anche un benchmark basato su HashMap del progetto open source Apache Harmony, tradotto a mano in JavaScript. Ulteriori informazioni sui benchmark inclusi in JetStream sono disponibili nella pagina di approfondimento di JetStream.
Siamo entusiasti di presentare questo nuovo benchmark. Per eseguirlo, è sufficiente visitare browserbench.org/JetStream.È possibile archiviare bug contro il benchmark utilizzando il sistema di gestione dei bug di WebKit sotto il componente Tools/Tests.