Pregunta

Considere la siguiente función de Javascript (1):

function setData(domElement) {
  domElement.myDataProperty = {
    'suppose': 'this',
    'object': 'is',
    'static': 'and',
    'pretty': 'big'
  };
};

Ahora, lo que no me gusta de esta función es que se crea el mismo objeto exacto cada vez que la función se llama. Puesto que el objeto no cambia preferiría crear una sola vez. Así que pudimos hacer los ajustes siguientes (2):

var dataObject = {
  'suppose': 'this',
  'object': 'is',
  'static': 'and',
  'pretty': 'big'
};

function setData(domElement) {
  domElement.myDataProperty = dataObject;
};

Ahora el objeto se creará una vez cuando se carga y se almacena en dataObject el guión. Pero vamos a suponer que setData se llama sólo ocasionalmente - la mayoría de las veces que el script se carga la función no se utiliza. Lo que no me gusta de esta función en este caso es que el objeto siempre se crea y se mantiene en la memoria, incluyendo muchas ocasiones en las que nunca se utilizará. Me imaginé que podría hacer algo como esto para lograr el equilibrio ideal (3):

var dataObject;

function setData(domElement) {
  if (!dataObject) {
    dataObject = {
      'suppose': 'this',
      'object': 'is',
      'static': 'and',
      'pretty': 'big'
    };
  }
  domElement.myDataProperty = dataObject;
};

¿Eso tiene sentido? Calculo que depende de cuando el intérprete decide crear un objeto. ¿Es realmente esperar hasta que pase la condición !dataObject, o lo hace entrar en la función, trata de ser inteligente y decide construirlo con antelación? Quizás diferentes motores de JavaScript tienen diferentes políticas con respecto a esto?

Luego, por supuesto, está la cuestión de si estas optimizaciones alguna vez la materia en la práctica. Obviamente, esto depende de factores como el tamaño del objeto, la velocidad del motor, la cantidad de recursos disponibles, etc .. Pero, en general, ¿cuál dirías que es la optimización más importante: a partir de (1) a (2) o a partir de (2) a (3)?

¿Fue útil?

Solución

La respuesta es, que no se supone que saber. Los ejemplos te mostró tienen muy poca diferencia entre ellos. La única manera en que se Alguna vez razonablemente se preocupa de esto es que si usted tenía evidencia real de que una u otra manera el rendimiento fue notablemente dañar o uso de la memoria en un intérprete en particular. Hasta entonces, es el trabajo del intérprete que preocuparse de esas cosas para usted.

Dicho esto, si realmente quiere saber ... Pruébalo y averiguar. llamar a las diferentes versiones de 1.000.000 de veces y ver la diferencia que hace.

Hacer una versión gigante del objeto y ver si hace mella. Ver administrador de tareas. Probar diferentes navegadores. Informar sus resultados. Es una mejor manera de descubrir que sólo pidiendo un montón de tirones en Internet lo que supongo que podría ser el caso.

sólo tener en cuenta que el objeto tiene que estar en la memoria de todos modos, independientemente ... como texto de origen

Otros consejos

Un nuevo objeto debe ser creado - no no puede ser, en parte debido a la especificación lo requiere, pero sobre todo porque la conducta alternativa sería contrario al sentido común, tomar:

function f() {
    return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"

¿Realmente esperas una nueva expresión de objeto de no producir realmente el objeto que está pidiendo? Porque eso es lo que parece querer.

Es concebible que lo que desea hacer:

var myFunction = (function(){
    var object = {a: "b", c: "d"};
    return function() { return object; }
})();

¿Cuál sería conseguir el efecto deseado, aunque usted tiene que darse cuenta de que el objeto que se está volviendo es un objeto completamente mutable que puede ser cambiado, y todo el mundo estaría compartiendo esa misma instancia mutando.

En primer lugar, me gustaría ponerlo en práctica en la situación # 2 y la carga una vez inmediatamente después de que se carga la página.

Si había un problema con la velocidad de la página, que mediría el tiempo necesario para realizar tareas específicas dentro de la página.

Si era muy caro para crear el objeto (relativamente hablando), luego se trasladaría a la situación # 3.

No hay ningún punto en la adición de la sentencia 'if' si realmente no comprar nada ... y en este caso, la creación de un objeto simple / grande es sin sudor de la espalda de su CPU. Sin mediciones, no se está optimizando - sólo está disparando a ciegas

.

En realidad es un método bastante común de la inicialización de las cosas que he utilizado personalmente en C ++ y Java.

En primer lugar, esta optimización no tendrá importancia en la práctica.

En segundo lugar, la última función es exactamente tan buena como la primera función. Bueno, casi. En la primera supongo que está a merced del recolector de basura, que debe destruir el objeto de edad cuando reasigna domElement.myDataProperty. Aún así, sin saber exactamente cómo funciona el recolector de basura en la plataforma de destino (y que puede ser muy diferente en todos los navegadores), no se puede estar seguro de que está ahorrando ningún trabajo en absoluto realmente.

Trate los tres de ellos en un par de navegadores y averiguar cuál es más rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top