Cosa si considera come un compito intensivo della CPU. In termini di ... un algoritmo/codice per esempio (non tanto un caso d'uso come il video editing, ecc.). La ragione è che sembra che la ragione principale per cui non si usa NodeJS qualcosa che mi piace molto è principalmente il lavoro intensivo della CPU. Quindi cosa conta? Ad esempio, è l'ordinamento, la ricerca, il grafico trasversale, la moltiplicazione della matrice?Ciò che conta come attività CPU intensive (ad esempio, ordinamento, ricerca, ecc.)
risposta
Termini come "intensivo" o "costoso" sono relativi e non è sempre evidente quali attività sono ad uso intensivo della CPU. In generale, tutto ciò che non è I/O è CPU. E I/O è asincrono in node.js, quindi non è un problema. Pertanto, ci rimane tutto tranne che l'I/O è costoso.
Il tuo approccio per scegliere modelli generali è saggio. L'ordinamento, la ricerca e persino gli algoritmi in generale sono vincolati alla CPU. Ovviamente, non puoi eliminare l'utilizzo della CPU, ma se riesci a rendere il tuo ordinamento del database al posto del codice dell'app, potresti stare meglio.
Vorrei anche tenere d'occhio i grandi occhielli. Un ciclo che non genera eventi asincroni è un collo di bottiglia. Naturalmente, non è possibile evitare del tutto i loop. Sono un dato di fatto per la programmazione. Se i tuoi anelli sono brevi, allora nessun problema. Se trovi un ciclo che viene eseguito 10.000 volte, potresti prendere in considerazione la possibilità di suddividerlo con setTimeout, process.nextTick o un processo di nodo separato.
10.000 sono stati scelti arbitrariamente. Dipende da cosa fa il ciclo. La tua milizia può variare.
Supponiamo che un'operazione sia costosa. Cosa farai per risolverlo? Crea un'estensione C++ per NodeJS e chiedi a JS di chiamarlo? O semplicemente mettere il costoso lavoro in una discussione di lavoro? O qualcos'altro? Forse crei l'app in un'altra lingua? –
Personalmente, il mio primo sforzo sarebbe quello di rendere l'operazione più veloce, poiché tutte le altre opzioni aggiungono complessità. Se ciò non è possibile, prenderei in considerazione setTimeout se stiamo osservando qualcosa che richiede solo un paio di secondi e forse dividerlo in 2-4 blocchi. Se ciò non bastasse, proverei un processo di lavoro. Come ultima risorsa, potrei considerare un'estensione C++. – Brandon
Si potrebbe voler controllare thread Webworker o un pacchetto simile https://npmjs.org/package/webworker-threads – Brandon
Lo scripting di Bash entra davvero in questo. Il mio professore è sempre insistere su di noi di scrivere codice efficiente che faciliterà il lavoro sulla CPU
Ecco un buon esempio di pratiche inefficienti in Linux
http://hacktux.com/bash/script/efficient
Un altro esempio mi viene in mente è funzioni ricorsive, o funzioni che si chiamano continuamente fino a quando una condizione è soddisfatta. Questi in genere richiedono molta potenza della CPU.
Molti di questi suggerimenti sono in realtà per la manutenibilità/portabilità/leggibilità, non le prestazioni, come l'utilizzo di eco, funzioni e array incorporati. – Brandon
I processi o le attività eseguite su un computer richiedono varie risorse quali cicli della CPU, memoria, disco o rete gestite dal sistema operativo, in modo che ogni attività venga eseguita in modo efficiente (senza attendere una risorsa se possibile).
Il sistema operativo tenta di ottimizzare l'utilizzo delle risorse consentendo a molti processi di utilizzare contemporaneamente le risorse . Se un processo richiede una particolare risorsa in grandi quantità, può strozzare (ritardare) la sua esecuzione. Si dice che il processo sia ad uso di risorse con questa risorsa. Quindi la risorsa è una terminologia relativa.
ordinamento, ricerca, grafico attraversamento, matrice moltiplicazione sono tutte le operazioni della CPU, un processo è CPU-intensive
o non dipende da quanto e come frequenti sono loro esecuzione. Ad esempio, trans-coding video
o compressing files
è piuttosto impegnativo per la CPU, perché esegue le operazioni della CPU molto più del necessario per leggere/scrivere memoria o disco. Se stai pianificando di fare ciò, dovresti creare un processo figlio separato per questo, in modo che non rallenti il processo del nodo, che è a thread singolo, o meglio creare uno node cluster.
Potrei usare Thread di lavoro, ma non sarà di grande aiuto se hanno bisogno di aspettare molto a lungo per esso completare? Quindi mi chiedo, a parte l'interfaccia utente sospesa (non difficile da risolvere con i thread di lavoro), è più lento di dire Python/Ruby per fare gli stessi calcoli? –
Ciò dipende da come viene eseguita l'implementazione in entrambi. JavaScript e Python sono entrambi linguaggi di scripting. Per uso generale, JavaScript è più veloce di Python (Python è migliore nei casi numericamente intensivi). Vedi qui http://www.quora.com/Programming-Languages/Is-JavaScript-v8-faster-than-Python. – user568109
Potrebbe essere utile se si spieghi cosa si sta tentando di fare che si pensa possa essere intensivo della CPU. –