2010-05-03 12 views
8

Tengo una página con menús desplegables encadenados. Elegir un option del primer select rellena el segundo y elegir un option del segundo select devuelve una tabla de resultados coincidentes utilizando la función innerHtml en un div vacío en la página.¿Cómo puedo forzar la recolección de basura de Javascript en IE? IE está actuando muy lento después de las llamadas AJAX y la manipulación DOM

El problema es que, una vez que he hecho mis selecciones y una considerable cantidad de datos se introducen en la página, todo el Javascript subsiguiente en la página se ejecuta excepcionalmente despacio. Parece como si todos los datos que retiré a través de AJAX para llenar el div todavía están acaparando mucha memoria. Intenté configurar el objeto de devolución que contiene los resultados de AJAX en null después de llamar al innerHtml pero sin suerte.

Firefox, Safari, Chrome y Opera no muestran ninguna degradación del rendimiento cuando uso Javascript para insertar una gran cantidad de datos en el DOM, pero en IE es muy evidente. Para probar que es un problema de Javascript/DOM en lugar de un viejo problema simple de IE, creé una versión de la página que devuelve todos los resultados en la carga inicial, en lugar de AJAX/Javascript, y encontré que IE no tenía problemas de rendimiento.

FYI, estoy usando el método jQuery.get de jQuery para ejecutar la llamada AJAX.

EDITAR Esto es lo que estoy haciendo:

<script type="text/javascript"> 
function onFinalSelection() { 
    var searchParameter = jQuery("#second-select").val(); 
    jQuery.get("pageReturningAjax.php", 
    {SEARCH_PARAMETER: searchParameter}, 
    function(data) { 
    jQuery("#result-div").get(0).innerHtml = data; 
    //jQuery("#result-div").html(data); //Tried this, same problem 
    data = null; 
    }, 
    "html"); 
} 
</script> 

quiero tener en cuenta que esto sólo se convierte en un problema cuando el retorno data es bastante grande. Está directamente relacionado con el tamaño, ya que puedo ver una desaceleración moderada para los resultados de tamaño mediano y solo una desaceleración importante cuando se devuelven unos cientos de registros.

Respuesta

7

Uso

$("#result-div").html(data); 

html() utiliza el método de jQuery empty que trabaja muy duro para evitar pérdidas de memoria.

has necesitado:

delete data; 

Estoy pensando que hay otros problemas de rendimiento en su código que causan la lentitud. ¿Sus datos de retorno utilizan PNG con transparencia alfa? He visto que mata IE6 (cuando se aplica el filtro alfa) y ralentiza considerablemente IE7.

+0

No hubo suerte con el uso de la función de html o eliminar. Solo estoy devolviendo una tabla de texto (muchas filas, pero solo texto) –

+0

¿Está vinculando eventos a las filas, celdas, texto dentro de las celdas? ¿Cuántos datos estás insertando? –

+0

Hay más de 2000 filas, para un total de ~ 250kb. Solo estoy vinculando un único evento en el DIV que contiene el conjunto de resultados completo. –

14

Puede forzar la recolección de basura en IE utilizando la función CollectGarbage, p. Ej.

if (typeof(CollectGarbage) == "function") 
    CollectGarbage(); 

El recolector de basura JScript se describe en detalle en esta entrada de blog: http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx

Como dice el blog, el GC no es predecible, por lo borrar los datos o datos = null se no recupera la memoria inmediatamente, pero finalmente la recuperará.


Pero dudo que su penalización en el rendimiento es realmente causado por el uso de la memoria; Creo que es un problema con la representación DOM.

+0

¿sabes si hay algún método similar para CollectGarbage que funcione en los navegadores webkit? – xus

+0

¿sabes si esto debe agregarse a cada archivo javascript en mi aplicación? – Ayusman

+0

No estoy del todo seguro de que esto sea válido para JS, pero en otros idiomas, cuando se fuerza la recolección de basura, empujará todos los objetos supervivientes a la siguiente generación, lo que puede ser increíblemente perjudicial si terminas presionando muchos objetos transitorios generaciones posteriores – xelco52

3

Si alguien interesado no sólo en IE:

Para forzar la recolección de basura en Gecko:

window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
    .getInterface(Components.interfaces.nsIDOMWindowUtils) 
    .garbageCollect(); 

Link

Cuestiones relacionadas