ejemplos - ¿Por qué esta gran diferencia de rendimiento para una función Javascript encapsulada?
javascript ejemplos (1)
No hay diferencia con la función de declinación y las expresiones de función WRT para la optimización, eso sería ridículo.
El código de la consola en Google Chrome está incluido en with
declaración como esta:
with ((console && console._commandLineAPI) || {}) {
//Your code is concatenated here
}
Debido a que las declaraciones de funciones son izadas, el código anterior será efectivamente este:
function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
}
with ((console && console._commandLineAPI) || {}) {
var start = Date.now();
Run();
console.log(Date.now() - start);
}
Entonces la declaración se está ejecutando afuera with
declaración. De hecho, no es una sintaxis válida tener declaración de función en un bloque, la declaración de función solo puede ser una declaración de nivel superior .
Entonces, de todos modos, debido a razones históricas, V8 es agradable y lo levanta en lugar de lanzar un error de sintaxis:
var i = 3;
with({i:4}) {
function test() {
console.log(i);
}
}
test();//logs 3 so it is obviously **not** under `with` influence
Entonces, como la declaración no está bajo declaración, se ejecutará mucho más rápido. With statement no es optimizable * en V8 y también rompe el alcance léxico.
* No optimizable significa que el compilador de optimización no mirará el código sino que el compilador genérico generará el código para la función. Es comparable al intérprete de Firefox vs modo JIT. Si desea saber más sobre qué características de idioma deshabilitan la optimización en V8, lea los asesinos de optimización
Entonces tengo este código simple:
function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
}
var start = Date.now();
Run();
console.log(Date.now() - start);
Y saldrá un tiempo alrededor de 335 ms. Eso es bastante bueno. Pero, si encapsulo la función Ejecutar así:
var d = Date.now();
(function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
})();
console.log(Date.now() - d);
Saldrá 18319ms, que es mucho peor que el caso anterior. Por qué es esto ?
Además, si es importante, lo estoy ejecutando en Chrome 26.0.1410.63, en la consola. En node.js, ambos fragmentos funcionan bien en la consola.