node.js - objects - slice jquery
¿Realmente node.js no optimiza las llamadas a[].slice.call(argumentos)? (2)
En los documentos de bluebird , tienen esto como un antipatrón que detiene la optimización. Lo llaman filtración de argumentos ,
function leaksArguments2() {
var args = [].slice.call(arguments);
}
Hago esto todo el tiempo en Node.js. Es esto realmente un problema. Y, si es así, ¿por qué?
Asuma solo la última versión de Node.js.
Es esto realmente un problema
Para el código de la aplicación, no. Para casi cualquier código de módulo / biblioteca, no. Para una biblioteca como bluebird que está destinada a ser utilizada de forma generalizada en toda una base de códigos, sí. Si hiciste esto en una función muy caliente en tu aplicación, entonces tal vez sí.
No conozco los detalles, pero confío en los autores de bluebird como creíbles que acceder a los arguments
de la forma descrita en los documentos hace que v8 se niegue a optimizar la función, y por eso es algo que los autores de bluebird consideran que vale la pena usar una macro de tiempo de construcción para obtener la versión optimizada.
Solo tenga en cuenta los números de latencia que dieron origen al nodo en primer lugar. Si su aplicación hace cosas útiles como hablar con una base de datos o el sistema de archivos, entonces la E / S será su cuello de botella y optimizando / almacenando en caché / paralelizando eso pagará dividendos mucho más altos que las micro optimizaciones en memoria de nivel V8 como las anteriores.
Descargo de responsabilidad: soy el autor de la página wiki
Es un problema si la función contenedora se llama mucho (estar caliente). Las funciones que filtran arguments
no son compatibles con el compilador de optimización (cigüeñal).
Normalmente, cuando una función está caliente, se optimizará. Sin embargo, si la función contiene funciones no compatibles, como la filtración de arguments
, ser una función activa no ayuda y continuará ejecutando el código genérico lento.
El rendimiento de una función optimizada en comparación con uno no optimizado es enorme. Por ejemplo, considere una función que agrega 3 dobles juntos: http://jsperf.com/213213213 21x diferencia.
¿Qué pasa si agrega 6 dobles juntos? 29x diferencia Generalmente, mientras más código tenga la función, más severa será la penalización para que esa función se ejecute en modo no optimizado.
Para node.js cosas como esta en general es en realidad un gran problema debido al hecho de que cualquier tiempo de CPU bloquea completamente el servidor. Simplemente optimizando el analizador de URL incluido en el núcleo del nodo (mi módulo es 30 veces más rápido en los puntos de referencia del nodo), mejora las solicitudes por segundo de mysql-express de 70K rps a 100K rps en un punto de referencia que consulta una base de datos .
La buena noticia es que el núcleo del nodo es consciente de esto