Press "Enter" to skip to content

GOTO 2015 • Benchmarking JavaScript • Vyacheslav Egorov


quindi ho lavorato lì
VM nella mia vita e come tutte le persone fanno dentro
VMs Ho iniziato con una Java VM e poi I
andato e partecipato al v8
sviluppo e parlerò principalmente
sulle cose relative v8 qui e per il
negli ultimi tre anni su cui ho lavorato
un compilatore ottimizzante per il dardo VM
e tutte queste VM su cui ho lavorato
avere una cosa in comune e la sua
la complessità alcune persone tendono a pensare
quella complessità viene da noi persone VM
cercando di garantire un certo livello di lavoro
sicurezza per noi stessi ma non lo è
il caso arriva la complessità perché
abbiamo il VMS devono eseguire tutti i tipi di
codice strano veloce purtroppo c’è a
effetti collaterali alla complessità e mentre il
MS esegue velocemente tutti i tipi di codice strano
a volte improvvisamente eseguono un codice semplice
lento e perché VM sviluppatori complessi
di solito non capisco perché
succede e cosa possono fare per risolverlo
e quello che sto cercando di fare qui è farlo
alleviare questo problema per te
con alcune metodologie o qualche modo di
pensando alle prestazioni che lo farebbero
ti permettono di risolvere i tuoi problemi solo
recentemente ho visto questa domanda così
domanda su Stack Overflow e monitoraggio
tutti i tipi di social media da vicino
alla ricerca di persone che hanno prestazioni
problemi e qualcuno ha scritto il grafico uno
implementazione in JavaScript se tu
non so cosa chiesa sono Tony è
va bene, non lo sapevo neanche io
è una cifra come tutte le cifre che ci vuole
alcuni byte e sputa alcuni byte
e fa un sacco di operazioni su interi
e sembra tutto ragionevole e quindi
esegue abbastanza velocemente per questo
sviluppatore come abbiamo fatto 20 megabyte a
secondo e non so se lo sia
veloce o lento perché lo so
crittografia così
probabilmente è lento ma sembra veloce
abbastanza per me
ma non sembravano abbastanza veloce per
lo sviluppatore che lo ha scritto così ha guardato
a quel suo kernel computazionale
cifrario e ha detto Oh cosa succede se provo a
eliminare il sovraccarico delle chiamate
all’interno del loop lì così ha preso questo
la funzione che era lì e giusta
inserito manualmente più volte come
completamente e puoi vedere che è molto
codici non sto nemmeno mostrando il completo
loop più corpo e cosa vorresti
aspettate che ci si aspetta sia accelerare
o un cambio di prestazioni neutro a destra
nulla dovrebbe essere cambiato ma su
All’improvviso, Chrome ha perso le prestazioni
di un fattore di 10 dopo aver fatto questo e
ovviamente nessuno è molto contento di non esserlo
felice quando ho visto questa domanda che ho detto
qualcosa di strano sta succedendo qui per il
salvataggio e ho guardato il punto di riferimento e
Ho guardato e ho guardato e ho trovato questo
funzione e quindi hanno messo questo commento
con un bel utente impressionante arte ASCII
dentro e ecco la performance
è stato restaurato quindi in pratica prendi questo
e tu lo impegni al tuo repo e al
il problema è risolto al problema successivo quindi
come facevo a sapere dove mettere questo commento
e cosa cercare bene è perché
Ho lavorato con la squadra v8 e terrò
il segreto per assicurarmi il successo
carriera di consulenza in futuro
bene, torniamo indietro un po ‘ e
parlare di benchmark in generale più
persone che parlano di JavaScript
prestazioni o parlando
benchmarking qualcosa in JavaScript
mondo pensano a GS / com se tu
mai visto questo sito bene è il migliore
per te ma questo è il posto dove
le persone scrivono benchmark per JavaScript
in modo che possano scrivere alcuni frammenti di codice e
poi corre la bardatura della nascita di Gesù
loro e traccia i grafici piacevoli come per
esempio qui puoi vederlo su Firefox
c’è un modo così alcuni in questo
un esempio particolare a cui qualcuno ha provato
trova i migliori due
per contare le occorrenze della
carattere nella stringa così all’improvviso
c’è un modo su Firefox per contare
questi eventi che battono tutti gli altri
browser e tutti gli altri modi per fare il
stessa cosa su Firefox e in questo modo è quello di
dividere la stringa con questo carattere e
quindi conta le lunghezze della matrice
viene restituito dalla divisione e quindi
sottrarre uno e questo fornisce come nove
e poi otto zeri dopo le nove, quindi è così
molto veloce che è veramente
controintuitivo e un altro modo di fare
è relativamente veloce su tutto il
browser secondo questo gioco di scacchi
è prendere la corda e poi camminare
carattere per carattere ma invece di
effettivamente usando la variabile di iterazione
lo affettate ancora e ancora producendo a
nuova stringa fino a quando la stringa è vuota
come se non ti venisse fuori questo
modo di iterare la stringa che non conosco
questo non è insegnato in nessuna università in
il mondo quindi se dovessimo avvicinarci a questo
roba cioè vorremmo solo andare e passare
tutti i nostri loop su stringhe a questo bello
nuovo modo, ma sto dicendo che non va bene
e non va bene è politicamente corretto
modo per dire cazzate, quindi dovremmo
dubita di tutto ciò che vediamo su GS / F
o in qualsiasi benchmark si scrive il
benchmark ottieni risultati per prima cosa
ne dubiti e non ti rivolgi
direttamente prima di capire cosa
in realtà sta succedendo lì, quindi facciamolo
backtrack ancora di più questo discorso è tornato
in realtà andare all’indietro da
invece le applicazioni alle basi
di andare dalle fondamenta al
applicazioni in modo che stiamo cercando qui
misurare le prestazioni di un singolo
operazione
bene come lo fai bene lo fai con
questo stato del nostro driver di riferimento qui
Prendi l’inizio del punto di riferimento
e poi tu sottometti l’operazione e
quindi sottrai dall’ora corrente
l’inizio del punto di riferimento giusto
cosa succede se l’operazione si tenta di
benchmark è in realtà più veloce del
orologio
hai accesso a Mi piace ad esempio I
dubito che l’aggiunta richieda millisecondi
sull’hardware corrente, a meno che tu non lo sia
correndo su un molto molto molto molto vecchio
computer molto vecchio computer quindi questo stato
di art bitch bug driver è un aggiornamento
si tenta di eseguire la stessa operazione
più volte e poi basta dividere
il tempo dedicato all’esecuzione di n
operazioni per ottenere il costo di un singolo
operazione questo è fondamentalmente matematica
dalla prima elementare come fai tu
operazione n volte poi dividi per n
tutta la magia accade e si ottiene il costo
di una singola operazione va bene è simile
alla nota principale dove c’era molto
massa, qui c’è molta massa
quindi diamo un’occhiata a ciò che Gesù perv
fa a questo bel caseolo qui
proviamo a fare un benchmark con una fetta e
roba del genere
beh, infatti, lo avvolge nell’esterno
ha generato una funzione come questa così
jesper genera il codice intorno a
i loro frammenti che fornisci e compila
utilizza dinamicamente la funzione
costruttore e se leggi affatto
più volte quindi forse una volta
dipende da quanto sei bravo o forse
zero volte se sei super bravo lo farai
si noti che non v’è un ciclo qui che è
eseguito più volte ripetendo il nostro
operazione qui e in fondo non abbiamo mai
inizializza la stringa che sono slice
fette lo affettano fino a quando non diventa vuoto
e poi quando sono uguale a uno iniziamo il
loop con la stringa vuota in modo che tutto il
operazioni dopo la prima misurazione
della prima operazione, in realtà
non costa nulla perché la stringa è
vuoto già così fammi ripetere il
la matematica ci aspettiamo che ripeta il
stessa operazione n volte ma ciò che noi
in realtà lo ripetemmo subito e
il resto costa come zero se tu
dividilo per n bene dividi C diviso per
N e C è molto piccolo e n è molto
grande perché J’s perf ripete a
migliaia di migliaia di volte e tu
ottenere circa zero è per questo che
sembra così veloce perché noi
abuso di GS perv e la misurazione è
fondamentalmente stiamo misurando il ciclo vuoto e
la lezione chiave qui da portare via è quella
è necessario garantire tale operazione quando
ripeti che sta facendo la stessa quantità
di lavoro ogni volta va bene così, ma scaviamo
più profondo quindi il problema è che non lo sei
da solo quando gestisci il tuo
punti di riferimento c’è qualcuno in piedi
dietro la schiena e guardando questo e
questo qualcuno è il tuo browser
essenzialmente perché lo sono i browser
molto intelligente diamo un’occhiata a questo
esempio ecco qualcuno cerca di
misurare qual è il modo più veloce per
convertire un intero nascosto all’interno di
stringa quindi una rappresentazione stringa di a
intero in un numero intero effettivo e
scopre che su Firefox il più veloce
il modo per farlo è doppio fino al
operatore in modo da applicare una tilde due volte
tilde è una negazione bit a bit e poi tu
ottenere intero e questo è molto veloce
come il tempo incredibilmente veloce per usare il doppio
tilde ovunque invece di int. int
beh probabilmente già ti rendi conto di come
questo discorso sta per andare , dirò
qualcosa qualcosa qualcosa che dicono
non e che sarebbe essa
i nostri browser e i macchinari all’interno
loro sono molto intelligenti anche se lo sono molto
intelligente perché abbiamo più browser
e ottimizzano il codice come esso
esegue e questo significa prima il nostro semplice
il modello di livello non funziona, dobbiamo andare
al secondo anno di scuola e
rendersi conto che ci sono più costi
coinvolto così prima la tua applicazione
inizia l’operazione inizia a costare
qualcosa e poi mentre il programma funziona
il costo cambia in realtà può essere più
complicato che il costo cambia più
tempi in cui alcuni browser hanno livelli multipli
trucchi come Safari ha interpretato che
in un compilatore di un altro compilatore e
poi un altro compilatore per compilatori in
totale bene Conteggio dell’interprete così
e possono passare avanti e indietro
più volte quindi è molto complicato
e quando puoi
fattore in tutto questo il
la matematica sfugge davvero di mano
e non puoi più avvicinarti con
questa matematica di prim’ordine a tutti e
devi iniziare a pensare così hai bisogno
iniziare a pensare e cercare di essere più intelligenti
rispetto al compilatore JIT ora ti mostrerò
come essere più intelligente del compilatore di fogli
e per mostrarti come essere più intelligente di
Compilatore JIT Devo mostrarti cosa
il compilatore dovrebbe effettivamente fare dentro e
Lo mostrerò su questo basato sul
rappresentazione sorgente del programma
i compilatori non operano sulla fonte
rappresentazione ma mostrandoti non
rappresentazione sorgente dello stesso
gli esempi mi richiederebbero più tempo
fondamentalmente mi richiederebbe
l’insegnamento è un corso di compilatore o al
meno parti di esso quindi usiamo solo il
fonte quindi abbiamo provato a misurare questo
raddoppio fino alla cosa e abbiamo scritto il
punto di riferimento quindi questa è una sorta di sintesi
o autista qui e poi c’è
isolamento qui e compilatori sono
cercando di fare lo stesso come faresti tu
il tuo programma quindi pensaci
te stesso come eri nel secondo o
terza elementare quando non eri quello
programmatore JavaScript stabilito ma
avevi già qualche ragionamento di base e
lo sai che se hai una costante
qui e lo usi solo una volta qui bene
hai appena messo lì giusto fa
senso totale e quindi puoi solo
valutare questa espressione passo dopo passo
ed è quello che fa il compilatore a
fondamentalmente, compili un tempo al momento della compilazione
questo è ciò che il compilatore arriva semplicemente
ha l’assegnazione di una costante a a
variabile e questo è ciò che non c’è
l’ operatore di tilde reale lasciato più a
eseguire
non c’è parsing che accada così tu sei
non misurare facendo qualcosa di questo
l’ottimizzazione è definita costante
propagazione e più o tutti ora tutti
imbroglia anche Internet Explorer perché
Internet Explorer JIT è abbastanza buono
in questi giorni o si chiama bordo in esso ora
Sono obsoleto, quindi tutti lo fanno qui
le persone possono diventare molto ottimiste e
dimmi mmm Posso ingannare il compilatore perché
Sono più intelligente e lo renderò noto
costante lì e non sarà in grado
per fare la propagazione costante più
beh sì, non sarebbe in grado di fare il
propagazione costante più ma ha
più trucchi nella sua manica lo faranno
guarda I è inizializzato uno da fuori
il ciclo e non cambia mai all’interno del
loop che significa che c’è fuori applicazione
fino a quando l’operatore non cambia
e questo significa che ti fregherà
andrà lì e dirà che questo è loop
invariante, quindi questa intera espressione è
ciclo invariante e invarianti del ciclo
può essere spostato fuori dal loop e posizionato
prima del ciclo proprio come faresti tu
al tuo codice manualmente e di nuovo tu finisci
con solo l’assegnazione di alcune variabili
a una variabile essenzialmente e tu sei
non misurare il tempo di analisi perché
accadrà solo una volta al di fuori del
loop questo è chiamato codice invariante del ciclo
movimento di nuovo tutti lo fanno senza
questo non puoi davvero raggiungere alcun bene
le prestazioni nei compilatori JavaScript possono
andare oltre possono guardare questo codice
e dite bene che non sembra
qualcuno sta usando questa variabile e se
nessuno usa questa variabile di cui nessuno ha bisogno
questo calcolo e nessuno ha bisogno di questo
calcolo che significa nessuno significa me
bene hasta la vista baby e alcuni
i compilatori arriverebbero al punto di dire
beh, c’è un loop che non è niente
ma girando bene anche ti vedo così
codice questo è chiamato codice morto
eliminazione
non tutti i compilatori andranno così lontano
eliminando i loop o l’ esempio v8
in questo momento non posso farlo ma ci sono
qualche nuova infrastruttura del compilatore
costruito nel v8 mentre parliamo o piuttosto a
dormi ora perché loro in Europa ma
cominceranno a costruirlo quando noi
dormi così che sarà in grado di eliminare
i loop così
ricorda questo esempio con il super
roba per dividere le stringhe veloce per on
Firefox bene si scopre che Firefox
è in grado di capire che dividere a
stringa da una stringa e prendendo il
lunghezze e facendo qualche calcolo
questo è a quel codice perché il risultato
non è mai usato e niente ha un lato
effetto qui così scompare e
è per questo che è così veloce e funziona
con una tale incredibile velocità in pratica se
che si vede nulla sul GSP in esecuzione con un
velocità come sei e poi otto zeri
significa che non sta succedendo nulla è un vuoto
loop e devi rivalutare il modo
tu scrivi il punto di riferimento, quindi cosa noi
stabilito qui è che l’ ottimizzatore è
tutti i parametri per la colazione
allineare la cena praticamente per tutto il giorno
a lungo e poi di notte anche tu
può provare a sviluppare benchmark che siano
impossibile per l’ottimizzatore mangiare
perché sei ancora più intelligente di
macchine di macchine giuste più stupide di
gli umani erano almeno per ora fino a quando
Skynet arriva e ottimizza tutto
via così il mio più grande suggerimento sul mio più
suggerimento comune alle persone che me lo chiedono
come scrivere benchmark più intelligenti
rispetto al compilatore non è quello di provare a scrivere
li usano solo il codice reale e
confronta le tue reali applicazioni in
produzione o qualcosa del genere
usa i tuoi utenti come sperimentale
criceti così sì torniamo al tema qui
sono tre suggerimenti su cosa puoi fare
fondamentalmente devi evitare di più
ottimizzazioni comuni evitando
le costanti evitavano invarianti di loop e
il viaggio nel codice morto ma il più
cosa importante che dovresti verificare
risultati quando lo fai davvero
benchmarking perché già
di solito aiuta a ingannare certi
ottimizzazioni come l’eliminazione del codice morto
perché si sta usando i valori di
verificarli quindi ecco cosa potremmo fare
a questo punto di riferimento per evitare i problemi
potremmo dire inizializzare due stringhe non
costanti e quindi iniziare a scambiare
li nel ciclo per tenerli non
invariante nel ciclo e poi lo fai
qualche check-in alla fine e tu butti
un’eccezione se fallisce e questo non lo è
male, ma potrebbe non essere ancora sufficiente se
il tuo compilatore è intelligente
per esempio i compilatori hanno questa suite
ottimizzazione dove loro
Diciamo che vedo il ciclo, cosa succede se ripeto il
il corpo prova ma fa due volte meno iterazioni
e poi ne fai uno aggiuntivo a seconda
sul fatto che sia pari o cosa cosa
succede qui è che se scambi due volte
all’interno del corpo ciò significa che non l’hai fatto
scambia tutto bene
swap si annullano a vicenda e compilatore
propaga alcuni valori e il corpo del loop
si trasforma in così base se ne hai due
compiti morti ad alcune variabili che
nessuno usa e poi tu hai un
assegnazione di un ciclo invariante e tu
non stanno misurando nulla di nuovo questo
l’ottimizzazione è definita ciclo di srotolamento
e nessuno lo fa ancora nelle VM JavaScript
per quanto ne so, per esempio v8 no
farlo, ma mi piace indurre paranoia
persone in modo che diventeranno paura
scrivere i parametri di riferimento va bene così ecco
lo scontro tra micro benchmark e
VM e ora stiamo passando a
seconda parte del discorso in cui sto andando
per mostrarti così prima ho mostrato come
Le macchine virtuali trovano bug nei tuoi benchmark e
trasformali in nulla ora mostrerò
come i benchmark trovano i bug nelle VM
e se non ti rendi conto di quel benchmark
può causare errori nel vmsu
completamente sbalordito dai risultati
ecco qualcuno che sta provando a misurare a
cosa strana non so come la gente
inventati queste idee per Jesperson
dormire è difficile da leggere, ma quello che è
succede che qualcuno abbia deciso di farlo
misurare se è più veloce
stringhe concatenate definite come letterali
o concatenare stringhe salvate nella variabile
catturato da una funzione e poi da te
concatenare queste due variabili e questo
scopre che su v8 quindi questa cosa g8
non essere spaventato da questo dollaro è
non un dollaro quindi non è denaro ma è
un prompt della shell in modo che la cosa DA abbia appena
una versione standalone di v8 che è
correre fuori dal browser è gentile
di come nodejs ma senza nota solo sì
quindi ho scritto questo benchmark standalone e
L’ho eseguito e si è scoperto che il
dentro così
hai definito i valori letterali delle stringhe all’esterno
della funzione quindi concateni
le variabili all’interno della funzione sono piuttosto a
un po ‘ più veloce fuori e l’intuizione quando
basta calcolare una stringa letterale è
più lento che è completamente
controintuitivo perché tu solo
letterali concatenati giusto dovrebbe essere
più veloce dovrebbe essere costante piegato così io
riuscito a combattere il mio istinto di muovere tutto
le mie corde fuori dalle funzioni e mantenute
loro giù e ho iniziato a guardare cosa
è successo con la mia bacchetta brevettata, quindi io
si aspettano che entrambe le varianti dovrebbero essere
completamente morto chiamato eliminato o a
meno costante piegato quindi c’è uno strumento
guardare le cose che ho scritto
pubblicità della freccia quindi è molto
paradossale e se clicchi su questo
collegalo e guardalo ora solo io posso
clicca su questa cosa ma se solo tu
google questo lo troverete così è a
strumento per vedere l’intermedio
rappresentazione utilizzata dall’ottimizzazione
compilatore dentro v8 e tutte le cose
che ti sto mostrando qui disponibile
come collegamenti all’interno di questo strumento in modo che sia giusto
pulito chiamato clic su di esso e it
scarica il roba e vi mostra
è completamente basato su browser e non ha
roba del componente lato server come quella ok
diamo un’occhiata perché fuori è
molto più veloce quindi questo è lo strumento così
c’è un URL dove puoi andare sul mio
sito e trovarlo distribuire lì e il
l’esempio è seduto qui quindi sono solo un ragazzo
clicca e poi vedi questo tipo di bello
UI o bene puoi ovviamente vedere che faccio 0
sviluppo web, ma mi sembra carino e
vedi le cose che sono così
ottimizzato quando il benchmark era in esecuzione
sul sito e se si fa clic su Mi piace
ognuna di queste voci rappresentano un
ottimizzazione che si è verificata durante il
corri fai clic sulla cosa e poi su di te
vedere un sacco di cose strane succedendo qui
come scrivere tutto questo Phi
che proveniva dal grasso asiatico e da tutti
tipi di cose che succedono qui
è un po ‘difficile da leggere, quindi il
foresta della roba che è in realtà
accadendo con il codice è nascosto dietro
tutti questi dettagli minuscoli del
implementazione del compilatore quindi c’è a
Olfa da quando ci siamo io che puoi
clicca e attiva qualcosa chiamato
modalità interessante questa modalità interessante
nasconde tutti i dettagli che sono
irrilevante e unisce la fonte di
il tuo punto di riferimento della fonte del tuo
Funzione JavaScript nell’IR IR S
sta per rappresentazione intermedia
o la rappresentazione interna dipende da chi
si parla di e questa fonte è giusto
accanto alle istruzioni prodotte da
da questa fonte quindi per esempio qui
puoi vedere che c’è una variabile di loop
decremento e questa è un’aggiunta
operazione lì e poi c’è il ramo
che non è un pranzo e una colazione
combinati insieme ma andare all’istruzione
essenzialmente così e quello che puoi vedere qui
c’è anche questa linea rossa qui
che significa l’annidamento del ciclo così è
molto facile trovare dove l’azione è
andando avanti in questo punto di riferimento e se tu
guarda e ti ricordi che si tenta di
concatenazione benchmark quindi solo tu
coprire quello in cui sta andando l’azione
la concatenazione non è assolutamente
andando avanti come se non ci fosse concatenazione
dentro c’è qualche doppia aggiunta
andando qui per una variabile di ciclo ma no
la concatenazione di stringhe così fuori è veloce
perché non c’è niente lì dentro
è il ciclo vuoto su cui li stiamo misurando
loop è veloce perché sta facendo
nulla, quindi, la vera fase v8 ha fallito il
colpa costante del caso quando ne hai avuti due
letterali insieme che è
controintuitivo
era un dorso che era stato fissato così tutto il
spalle che ti mostro qui erano
risolto forse così
questo per esempio mi sono riparato
prima ancora era stato risolto nel v8 è
correzione piuttosto semplice dopo aver speso a
un paio d’ anni e v8 ma non me ne vado
per entrare nei dettagli di ciò che sta accadendo
Qui
in pratica è possibile vedere che è come 1 2
3 4 qualunque 10 righe di codice otto
linee di codice ancora migliori e dopo
riparandolo dentro e fuori diventano
della stessa velocità ma dovremmo ricordare
tutto è questo è veloce è vuoto
vuoto entrambi ora stanno facendo nulla di così
scratch questa mossa di riferimento al
meglio quello che dovremmo pensare bene come
il modo in cui dovremmo pensare a tutti
questa roba è che dovremmo assumere che il
il codice ragionevole che scriviamo è ragionevolmente
velocemente lo chiamano la presunzione di
prestazioni come la presunzione di
innocenza quindi VM è sempre innocente fino al
provato colpevole e tu lo dimostri colpevole
scrivendo benchmark ragionevoli e provando
per capire cosa succede e succede
dentro di te non lo dimostri colpevole solo
saltando alle conclusioni ma alle persone
in realtà saltare alle conclusioni tutto il
tempo così la gente pensa alle catene del prototipo
sono lenti e scrivono punti di riferimento
confermalo per confermare il proprio
ipotesi su catene prototipo così
per esempio qui creiamo molto profondamente
catena prototipo annidata con questo fantastico
oggetto punto creare cosa e partiamo
qualche elenco di tributi alla fine per il
persone a cui piace Lisp e poi scriviamo
questo bel punto di riferimento per qualsiasi cosa
anche tre anelli perché ne abbiamo molti
di lettere nell’alfabeto inglese e
quindi solleviamo manualmente la proprietà
accesso e quindi nutriamo questi due
versioni insieme usando il nostro stato
driver di riferimento qui e misuriamo
il primo che guarda su ciascuno di essi
iterazione e poi misuriamo il secondo
una che memorizza nella cache di fuori del ciclo
e vediamo che fare molte ricerche è
otto volte più lento di incassare sembra
ragionevole ragione
ciò significa che abbiamo confermato ciò che pensavamo
le catene prototipo sono lente okay se noi
supponiamo che questa è la verità che facciamo
più difficile cosa succede se prendo la creazione
di questa catena prototipo e dico
invece di creare la proprietà dei dati
usa il getter
cosa pensi che accadrà lo farà
diventare ancora più lento da quanto
la gente sa che gli accessori sono ancora più lenti
che le normali proprietà bene si trasforma
fuori diventa 8 volte più veloce come quello
è successo qui
la magia voodoo è accaduta così se guardiamo
utilizzando il hider IR scopriremo che
l’accesso alla proprietà quando è definito come
un getter è in linea
perché Gator è solo alla fine un
funzione e stiamo usando la costante
nell’operazione di addizione laggiù così
l’effettivo accesso ai costi costanti
niente e nel caso della proprietà
la proprietà dei dati definita su
prototipo lo scopriamo improvvisamente
c’è questo carico chiamato generico
operazione che è in realtà una chiamata e
non c’è una costante 10 dentro e così
non è stato nemmeno tirato fuori dal giro
perché puoi vedere questa linea rossa in corso
qui bene si scopre che lo eravamo
benchmarking su nota una nota è bene
noto per essere molto obsoleto con v8
versione e la persona che ha scritto questo
punto di riferimento ha usato la versione ancora più vecchia
di nota come da qualsiasi quattro anni
fa e quella versione di v8 no
supporta correttamente le proprietà dei dati
definita su prototipi esso supportato solo
proprietà dei dati immediate ma aveva
supporto per getter definiti su
prototipi è per questo che il Gator era
più veloce quindi se provi una nuova v8 allora tu
vedere che sono ugualmente la stessa velocità
senza Gator senza Gator
trucco così e la catena del prototipo
attraversare come abbiamo visto Dio completamente
guardato fuori dal giro non c’è
controlla a sinistra dentro per il prototipo
verificare la presenza di un prototipo per la stabilità di
i prototipi vanno bene e ora per qualcosa
completamente diversa questa luce era
lì prima ancora ho visto il keynote così
questo non sta plagiando la nota chiave
è un piacere scrivere dei grandi
Umorismo britannico così
cosa succede se eseguiamo lo stesso benchmark due volte
come fanno molte ricerche su misura due volte
cercare e memorizzare nella cache due volte bene
si rivela la seconda volta anche sul
il nuovo modo in cui lo mangiamo rallenta improvvisamente
un fattore di circa tre come Oh cosa
è appena successo di nuovo qui
successo se guardiamo nel IR pelle giusta
ora non ho intenzione di entrare nei dettagli
perché voglio ancora dirtelo
roba prima che tutti noi fuori di qui il simile
Ti ho detto che possono esserci più cose
versioni ottimizzate della stessa funzione
mentre corre e questo è esattamente cosa
è successo qui così prima v8 è venuto e
ottimizzato la loro funzione quindi se tu
ricorda cosa stavamo facendo lì noi
stavano facendo sommatoria qui, quindi abbiamo un
contatore e quindi aggiungiamo solo il
costante dieci ancora e ancora al
contatore quindi abbiamo mangiato prima ottimizzare il
codice supponendo che il contatore si inserisce
Numero intero a 31 bit che è chiamato piccolo
numero intero e buttiamo il mio in breve
allora questo contatore trabocca e noi D
ottimizza il codice e quindi re ottimizza
usando l’ inserto a due per il
contatore che non è ancora abbastanza perché
stiamo facendo abbastanza iterazioni per
overflow intervallo 32 bit pure e poi
D ottimizza e produce la versione
con un doppio codice all’interno per questo
contrastare questo D ottimizza di nuovo perché
abbiamo raggiunto la fine del ciclo e v8d
ottimizza quando raggiunge il percorso del codice
che non sono mai stati eseguiti prima di questo
quindi questo è diversi tipi di
ottimizzazioni fanno uso la codifica a colori
per significare come questo è un così chiamato
desideroso l’ottimizzazione che accade
quando qualche ipotesi è violata nella
codice e questo è il cosiddetto soft G
ottimizzazione che accade quando tu
raggiungere il percorso del codice che non è mai stato
eseguito e quindi la versione substa
boli e mai l’ottimizza di nuovo
puoi vedere che non ha colori speciali
solo nero così
ma purtroppo si è stabilizzato in un molto
stato strano quindi ora il contatore è
memorizzato come variabile taggata in modo tattile
è il v8 il JavaScript è un
linguaggio tipizzato dinamicamente così deve
immagazzina cose che può immagazzinare cose in scatola
Mi piace perché hai bisogno di quel tipo assegnato
al valore e questo è chiamato taggato
nella v8 a causa dell’implementazione
dettagli su cui non ho intenzione di entrare
qui ma per prendere il numero necessario
allocare la scatola per questo e questo è
precisamente quello che succede qui così prima tu
annulla il contatore in modo da prendere il numero
dall’interno della scatola convertita al
numero di macchina e poi fai a
operazione diversa e poi Reeboks
torna nella scatola e ogni volta che si
Reeboks si assegna una nuova scatola così
questo ovviamente ti costa, ecco perché
rallentato da questo fattore di tre I
potrei spiegarti perché succede, ma io
non voglio entrare nei dettagli perché
è di nuovo la schiena e simili
spiegato nella scatola non è divertente è molto
divertente è molto più divertente mostrarti il
risultato di questa scatola cosa fanno al tuo
codice fondamentalmente questa operazione più a
la fine del ciclo confondeva il
abbiamo pensato al bancone
variabile e potresti girarci intorno
aggiungendo due stringhe ad esempio al
contrastare è un po ‘di magia
succedendo qui il bug dovrebbe essere corretto
ora pure così non hai bisogno di farlo
alle tue aggiunte ma prima che lo fosse
corretto che avresti potuto andare in giro
facendo così così dopo aver fatto tutto questo
li eseguono in modo piacevole e veloce e il
la seconda corsa è più veloce della prima
come ci aspetteremmo ora, facciamolo
deserto o non deserto ho dimenticato uno s così
la funzione del colon metilico è chiamata a
argomento di discussione molto popolare nel nostro
mondo così qualcuno voleva un punto di riferimento
ciò che è più veloce è preso da giusto
invocazione di funzione di gioco perfetta così
c’è questa funzione che fa alcuni
calcolo dell’arresto anomalo sulla stringa o sul
invocazione di metodo così ha preso o lei ha preso
la stessa funzione
e applicato lo ha messo sul prototipo
di qualche oggetto vuoto come se fosse una fabbrica
trampolino adattatore conosciuto da noi da
Modelli di design Java sì e poi
basta solo confrontare la funzione
invocazione o invocazione del metodo e
presumerai che si esibirebbero
lo stesso ma si scopre che il
metodo è stato completamente ottimizzato il modo
ma la funzione sta facendo molto bene
lentamente
quindi qualcuno mi sta chiamando da Los
Angeles riattaccano okay, quindi sono
diventando molto popolare comunque così perché
la chiamata al metodo era più veloce, quindi ho intenzione di farlo
mostrarti la soluzione alternativa per questa borsa ma
mai mostrarlo a nessun altro
quindi ho appena preso il setup del
punto di riferimento e ho aggiunto questo magico
le concatenazioni di fronte accelera il tuo
JavaScript con questo trucco vir e
ed ecco che lo ha effettivamente accelerato
così ancora una volta il mio bagliore brevettato gira
che prima di me che
non esisteva un benchmark di funzione
ottimizzato affatto per qualche ragione noi
non lo stava affatto ottimizzando e di
Certo se non lo ottimizzi lo farà
essere più lento del completamente ottimizzato
metodi di riferimento c’è un
spiegazione qui ma tutto bolle
raddoppia insieme sì quella roba
e NON entrerò nei dettagli
ma guardiamo il codice una volta inserito
queste cose di fronte ed è stato
ottimizzato quindi c’è questo pannello sorgente
in un telecomando IR che puoi usare per guardare
la fonte riga per riga e per esempio
linee che non producono codice sono
ombreggiato e c’è qualcosa di speciale
cose che indicano che la funzione chiama
qui era in linea e così via così così
si scopre che dopo averlo forzato a
ottimizzare questa cosa qui è completamente
in linea ora
e se si fa clic sul marcatore di allineamento
andrai a vedere la fonte del
funzione inline che può essere abbastanza
utile e c’è questo strano ondulato
sfondo che è abbastanza psichedelico
ma non ho potuto trovare un modo migliore
per dimostrarlo
questo significa fondamentalmente questa linea prodotta
il codice ma è stato tirato fuori dal
loop in cui originariamente era un
modo semplice per trovare le linee di codice che
sono stati completamente spostati dal ciclo
movimento di codice invariante quindi ecco l’unico
cosa che afferma e il benchmarking
il ciclo era questo confronto stupido e
restituire cosa indefinita è perché
il modo in cui ha un linguaggio storico che
impedisce che rimuova o si muova
intorno ai rami quindi ma a tutto il resto
che provi a fare il punto di riferimento è andato via e
ecco perché è così veloce di nuovo così è
diventando davvero una cosa ripetitiva
dì ma non stiamo misurando nulla
Qui
andare avanti così può la funzione chiamata essere
più veloce del metodo lo chiama bene
risulta che può essere così ho detto che lavoro
il team di freccette e abbiamo un compilatore per
JavaScript e questo è ciò che il compilatore
a volte produce che abbiamo questo
concomitante quindi questo è un loop-the-loop
beh, questo è sbagliato qui dovrebbe esserci
no, ma ignoriamo che questo è un
loop iterando sulla lista e noi
produce quasi il ciclo di JavaScript ma
ha il controllo di modifica simultanea
lì che controlla che se si modifica
la lunghezza della distanza dal lato del ciclo
allora genererà un errore dentro e
sono venuti da me e hanno detto che puoi fare
questo codice veloce come questo codice con no
controllo simultaneo delle modifiche su v8 e
Ho detto che è più lento e hanno detto di sì
è più lento del 18% vorremmo questo 18%
indietro e poi ho guardato e ho detto
beh, c’è una soluzione che ti serve
per scriverlo in quel modo mettere zero virgola e
poi il nome della tua funzione e poi
un po ‘di roba dopo di esso e a loro piace
mi guardò e poi chiamò il
ambulanza così bene internets infatti
scopre che in realtà lo rende
stur, perché questo accade bene fammi ripetere
quello che ho fatto ho appena aumentato del 18% la velocità
sostituendo la chiamata al metodo con una funzione
chiama il codice che non esegue mai
perché non si butta mai lì
perché questo particolare punto di riferimento
itera la lista senza cambiarne la
lunghezze Ho appena ottenuto la velocità
cambiando il codice che non viene mai eseguito durante
il punto di riferimento Wow, sono bravo
bene si scopre che se scrivi il
codice come questo non è mai stato eseguito
durante la corsa di riferimento e noi no
sapere dove andrà se sarà
eseguito perché non sa che ha
presumere che possa avere arbitrarietà
effetti collaterali e deve mantenere
ricaricando le lunghezze qui e ricaricando
le lunghezze qui e cose del genere e
è per questo che è più lento del non farlo
il controllo perché il resto di questo ha
senza effetti collaterali è solo questa chiamata
va in qualche posto sconosciuto
potenzialmente hanno effetti collaterali quindi questo
anche il codice non è mai stato eseguito ma
i carichi di proprietà sono trattati appositamente in
v8 se il carico di proprietà non è mai stato
eseguito v8 direbbe questo passaggio possibile
mai essere preso questo non si applica a
chiede alcune ragioni che sono abbastanza
profondo così profondo che non ho mai fatto immersioni profonde
abbastanza non va bene lo stesso, perché noi
presume che quel passaggio non possa mai essere
presi non ci sono effetti collaterali rimasti
il ciclo e può sollevare tutta la roba
e ottimizzare le cose come si issa
questa lunghezza è rallentata e cade via
ramo si può vedere è ora completamente
oscurato quindi cosa vorrei in realtà
consiglia di non confrontare le cose e se
hai bisogno di confrontare le cose parlare con il
Le persone VM, quindi, molte grazie
beh, non aspettare, ce n’era un altro
ad esempio in fin dall’inizio della
parla quindi ricorda questo ragazzo qui che io
accelerato dal commento, si scopre
che se lo guardi nell’oscuratore IR
hai questo ripetutamente il
ottimizzando la funzione di blocco del cancello in questo modo
la funzione è chiamata get block e
completamente va dei binari
e questo è dove l’ ottimizzazione
succede perché Hydra ti mostra tutto
e ripetitivo l’ottimizzazione è il
caso in cui mi chiami da Los Angeles
e chiedi di presentare una copia in V
quindi è sempre un ritorno in v8 se parliamo
a Mises in ancora e ancora e ancora
e non si stabilizza mai di nuovo, sì loro
ho la spiegazione di cosa è successo
lì c’è un modo più sano di camminare
del commento che volevo solo fare
è divertente perché so come funziona il
stessa soluzione è solo per troncare questo
valore caricato qui dall’array UN 32
immediatamente a in 32
ma questa parte è stata riparata l’ ho riparato e
quindi in pratica non dovresti mai dare per scontato
che qualcosa è lento se è lento e
roba del genere tutte le cose e io
ha detto di parlare con la gente M come me se tu
ho bisogno del mio aiuto e questa è una vera lente
grazie mille

Please follow and like us: