2008-10-17 11 views
31

El problema está en el título - IE se está portando mal y está diciendo que hay una secuencia de comandos ejecutándose lentamente - FF y Chrome no tienen este problema.una secuencia de comandos en esta página está causando, es decir, ejecutar lentamente

Cómo puedo encontrar el problema. .Hay un montón de JS en esa página. Verificar a mano no es una buena idea

EDITAR: Es una página de un proyecto en el que estoy trabajando ... pero necesito una herramienta para encontrar el problema.

Fin: Resultó ser el UpdatePanel - de alguna manera se "confundiría" y tomaría demasiado tiempo procesar algo. Lo tiré por la ventana, solo usaré JQuery a partir de ahora: D.

Y estoy seleccionando la respuesta de Remy Sharp porque realmente no sabía nada de la herramienta y me parece genial.

+1

http://support.microsoft.com/kb/175500 –

+0

Gracias, esa fue la respuesta que estaba buscando. Creé una página que se ejecutará en una máquina local para un cliente y es muy intensiva en JS (permite buscar/ordenar 100.000 registros), así que realmente no había una manera de "optimizar" más, fue solo una cuestión de una gran cantidad de datos que se operan. – jsuggs

Respuesta

18

conseguirse una copia de la página de perfiles de IBM:

https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=61d74777-1701-4014-bfc0-96067ed50156

Es gratis (siempre una victoria). Empieza en segundo plano, concédele unos segundos y luego actualiza la página en IE. Vuelva al generador de perfiles y enumerará todos los recursos utilizados en la página y le proporcionará información detallada sobre el perfil, en particular, donde JavaScript tarda mucho tiempo en ejecutarse.

Debe ser un buen comienzo para encontrar el origen de su problema.

Si las etiquetas de secuencia de comandos están en línea, sugiero crear una copia local del archivo y separar las etiquetas de secuencia de comandos en archivos separados si es posible.

+2

Me puede estar faltando algo, pero la herramienta que vinculó no parece hacer el perfil de javascript que sugirió. Todo lo que hace es dar detalles sobre qué recursos se cargaron. – andynormancx

+0

La herramienta es para analizar toda la página. Por lo tanto, desglosa los componentes individuales, me dice el tiempo de solicitud, el tiempo de entrega y el procesamiento (o el tiempo de proceso), tanto en el caché vacío como en el cebado. Esto ayudaría a identificar componentes lentos y ayudará a comparar todos los cambios que realice. –

+1

pero ¿cómo puede eso dar la solución a este problema ya que este problema se debe a alguna ong ejecutando javascript o bucle infinito en el bloque de código page profiler solo gicves parte de la red –

9

Elimine la mitad del código y vea si todavía sucede. Si no, está en la mitad que eliminaste. Repita hasta que descubra qué bloque de código está causando el problema.

+2

ya probé esta, pero todavía no hay suerte ... seguiremos intentándolo. Esperaba una herramienta de algún tipo. – sirrocco

+0

Funcionó para mí. el culpable fue selectivizr. aquí está la solución: - https://github.com/keithclark/selectivizr/pull/51/files – BenG

3

Por lo general, este es un ciclo infinito. Comprueba tus bucles y sus condiciones de salida.

0

No creo que haya una herramienta que pueda encontrar el script ofensivo. Puede intentar adjuntar un depurador de IE como Visual Studio y quizás se rompa en el punto donde se produce el problema. Pero no puedo dar ninguna garantía sobre ese trabajo.

En el pasado, cuando tenía problemas similares, simplemente comenté las secciones de código para evaluar el lugar donde se estaba produciendo el problema, generalmente en un patrón de tipo de búsqueda binaria. Comente la mitad de las bibliotecas de JavaScript, etc.

Aparte de eso, como otros han dicho, este tipo de problema se produce a partir de bucles grandes y muchas llamadas a la función setTimeout o bucles recursivos setTimeout.

0

Si JavaScript ataña el procesamiento de la página durante más de 10 segundos, aparece este mensaje. IE obviamente tiene un motor JavaScript más lento, causando esto.

Supongo que algo de optimización de código sin duda ayudará, y tratar de reducir la cantidad de javascript que se ejecuta en la carga de la página. Tal vez use setTimeout() para diferir el procesamiento de algunas cosas innecesarias si es necesario.

En lo que respecta a las herramientas, use el generador de perfiles de Firebug para ver dónde está gastando tanto tiempo.

+0

Lo que pasa es que no está esperando 10 segundos ... tal vez 2-3 segundos antes de mostrar el mensaje. Pero ... hasta el lunes no tendré manera de probar ... se actualizará el lunes. – sirrocco

+0

Si ese es el caso, es probable que estés en un ciclo infinito. Para probar esto, puedes probar Firefox en una máquina muy lenta o IE en una realmente muy rápida. –

+0

¿Tiene alguna referencia para el límite de 10 segundos? Nunca había visto eso antes pero coincide con mis propias experiencias. – liammclennan

51

largos que se ejecuta se detectan de manera diferente por diferentes navegadores:

  • IE elevará la advertencia una vez 5 millones de declaraciones han sido ejecutados (more info on MSDN)
  • Firefox advertirá si el script lleva más de 10 segundos (more info on MDN)
  • Safari advertirá si el script lleva más de 5 segundos
  • Chr ome (1.0) no tiene un límite establecido y simplemente seguirá intentándolo hasta que se produzca una excepción OutOfMemory en la que se bloquee
  • Opera continuará ejecutándose para siempre, sin previo aviso.

Nicholas Zakas has written an excellent article covering this topic.

Como tal - la mejor manera de evitar estos problemas es mediante la reducción de bucle, la recursividad y la manipulación del DOM.

1

I just blogged about this y pongo lo que creo que es una solución muy elegante. Entonces mira. Como mencioné anteriormente, mi solución simplemente divide las operaciones de larga ejecución en partes, pero proporciono una buena clase de utilidad para hacer esto.

Gracias

Guido

0

Si usted tiene control sobre el código JavaScript, que podrían romperla en las secuencias de comandos separados o intentar un enfoque Lazy Load.

Sólo mi $ .02

1

También puede comprobar si hay un análisis de JavaScript de Google incluyen en su página. El error solo se produjo con IE y una vez que se eliminó el código de Google, ¡funcionó!

1

Asegúrese de que por debajo de código JavaScript se ejecuta sólo una vez:

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(win_onload); 

Por encima de código dentro de la función es win_onload().

0

En mi caso, tener demasiados controles ASP.NET HoverMenuExtender en un GridView vinculado a muchas filas estaba causando un rendimiento extremadamente lento. Eliminé el HoverMenuExtender y mis problemas de velocidad (y el diálogo) desaparecieron. No está del todo relacionado con por qué aparece el diálogo, pero podría ayudar a alguien.

1

Descubrí que la adición de alerta ('antes X') de alerta ('después de X') fue útil para encontrar mi problema. Yo les añadí a mis $ (function() {

}

0

Hay pocas razones para este tipo de alerta

  1. Nº de instrucciones ejecutadas por JS IE excede los límites predefinidos. Esto puede solucionarse editando el registro de Windows. Vea Here

  2. Optimice el código de javascript para reducir el tiempo de ejecución.

  3. La optimización del código JS es un tema real de prueba y error y existen pocas reglas para hacerlo. Solo Google.
+0

Es realmente difícil saber qué guión es cuello de botella. Puede ser el depurador de Visual Studio se puede utilizar para rastrear el lugar. – Kinu

Cuestiones relacionadas