2012-03-29 11 views
42

Ho una pagina ampia e complessa che fa molto affidamento su knockout.js. Le prestazioni stanno iniziando a diventare un problema, ma esaminare lo stack delle chiamate e cercare di trovare i colli di bottiglia è una vera sfida.Ottimizzazione delle prestazioni di un'applicazione a eliminazione diretta - Linee guida per migliorare i tempi di risposta

ho notato in un'altra domanda (Knockout.js -- understanding foreach and with) che la risposta accettata è il commento:

... e io non suggerisco di usare with in cui è necessaria ad alte prestazioni a causa dell'overhead ...

Supponendo che la dichiarazione sia vera, questa è una cosa davvero utile da conoscere e non ho trovato una fonte per tali suggerimenti sulle prestazioni.

Pertanto, la mia domanda è:

Esistono linee guida generali/migliori consigli che posso applicare per aiutare le prestazioni della mia candidatura prima di arrivare in profondità nel classico ottimizzazione delle prestazioni.

+0

Ho una serie di consigli per condividere , ma non c'è tempo. Pubblicheremo stasera. –

+0

@RPNiemeyer - Grazie Ryan. Sarebbe grandioso. –

+1

Non ho suggerimenti generali, ma potresti provare la versione beta di 2.1 poiché i commenti suggeriscono che ci sono stati alcuni miglioramenti generali delle prestazioni. – ShaneBlake

risposta

37

Penso che sarebbe troppo per il layout dei suggerimenti che ho in mente in una risposta.

Ho iniziato una serie di post di blog su questo argomento. Il primo post è here.

Questo post descrive un po 'come funziona if/with (copia gli elementi secondari come modello e re-rendering utilizzando il modello ogni volta che viene attivato l'associazione) e spiega come questi binding possono causare il re-rendering molto più spesso del previsto.

Aggiornerò questa risposta con i post futuri.

+4

Post del blog eccellente, Ryan. L'implementazione dei suggerimenti su "se" il rerendering dei binding ha già apportato una differenza misurabile alla mia applicazione. In attesa di futuri post sul blog su questo problema. –

+2

[Qui] (http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html) e [here] (http://www.knockmeout.net/2012/06/knockoutjs-performance-gotcha-3-all-bindings.html) sono gli ultimi post su questo argomento. – Sherlock

+0

Ciao, e grazie per il post. Ho una domanda. Sto recuperando un array osservabile da ajax ma le prestazioni sono così lente da caricare i dati su un tavolo. potresti raccomandarmi un altro modo, per favore? – UserEsp

6

Uno dei più grandi grattacapi che ho trovato (e non si vede discusso altrove) è che Knockout rivaluta ogni vincolante su un elemento ogni volta che qualsiasi vincolante per l'elemento cambia.

Questo di solito non è un grosso problema, ma per i collegamenti che tendono ad essere costosi (ad esempio template), può creare problemi di prestazioni significativi.

Fissare associazioni che il rendering del contenuto/bambini (template, foreach, ecc) per un elemento virtuale (utilizzando l'containerless control flow syntax) se non sono l'unico vincolante per l'elemento.

+1

Questo test jsperf mostra quanto è costoso l'indirezione di un binding di modello. http://jsperf.com/knockout-template-binding-performance/2 –

+0

RP Niemeyer ha pubblicato un post sul blog relativo a questo problema: http://www.knockmeout.net/2012/06/knockoutjs-performance-gotcha-3- all-bindings.html –

+3

Knockout 3.0 risolve questo problema, tra l'altro: http://blog.stevensanderson.com/2013/07/09/knockout-v2-3-0-released-v3-0-0-beta-available/ – Jonathan

0

Penso mappatura può aiutare anche voi potete seguire questa prova e vedere la differenza tra l'utilizzo jquert mappa, mappa knockout knockout-map-vs-jquery-map

Quando si inizia a utilizzare la mappatura pesantemente ObservableArrays diventano cruciali

Problemi correlati