El rendimiento es una característica. Tienes que diseñar el rendimiento desde el principio, o tendrás que reescribir tu aplicación más adelante. Dicho esto, ¿cuáles son algunas buenas estrategias para maximizar el rendimiento de las aplicaciones Active Server Pages (ASP)?
Este artículo describe técnicas para optimizar aplicaciones ASP y Visual Basic® Scripting Edition (VBScript). Este artículo analiza una serie de dificultades. Las sugerencias enumeradas en este artículo se han probado en http://www.microsoft.com y otros sitios, y los resultados han sido muy significativos. Este artículo supone que ya tiene conocimientos básicos del desarrollo ASP, incluidos VBScript y/o JScript, aplicaciones ASP, sesiones ASP y otros objetos inherentes a ASP (solicitud, respuesta y servidor).
Normalmente, el rendimiento de ASP depende principalmente de muchos factores además del propio código ASP. En lugar de enumerar toda la información en un artículo, enumeramos los recursos relacionados con el rendimiento al final del artículo. Estos enlaces cubren temas ASP y no ASP, incluidos objetos de datos ActiveX® (ADO), modelo de objetos componentes (COM), bases de datos y configuración de Internet Information Server (IIS). Estos son algunos de nuestros enlaces favoritos; asegúrese de revisarlos.
Consejo 1: almacene en caché los datos utilizados con frecuencia en el servidor web.
Una página ASP típica recupera datos de un almacén de datos de back-end y luego convierte los resultados al lenguaje de marcado de hipertexto (HTML). Independientemente de la velocidad de la base de datos, recuperar datos de la memoria siempre es mucho más rápido que recuperar datos del almacén de datos de fondo. Leer datos de un disco duro local también suele ser más rápido que recuperar datos de una base de datos. Por lo tanto, el rendimiento a menudo se puede mejorar almacenando en caché los datos en el servidor web (almacenados en la memoria o en el disco).
El almacenamiento en caché es la forma tradicional de intercambiar espacio por tiempo. Si almacena en caché el contenido correcto, podrá ver una mejora significativa en el rendimiento. Para que el almacenamiento en caché sea eficaz, se deben guardar los datos que se reutilizan con frecuencia, y volver a calcular estos datos requiere una sobrecarga (moderadamente) grande. Si el caché contiene todos datos obsoletos, provocará un desperdicio de memoria.
Los datos que cambian con poca frecuencia son buenos candidatos para el almacenamiento en caché porque no tiene que preocuparse por sincronizarlos con la base de datos a lo largo del tiempo. Las listas de cuadros combinados, las tablas de referencia, los fragmentos DHTML, las cadenas de lenguaje de marcado extensible (XML), los elementos de menú y las variables de configuración del sitio (incluidos los nombres de fuentes de datos (DSN), las direcciones de protocolo de Internet (IP) y las rutas web) son buenos cachés candidatos. contenido. Tenga en cuenta que puede almacenar en caché una "representación" de los datos sin almacenar en caché los datos en sí. Si la página ASP cambia raramente y su almacenamiento en caché es costoso (por ejemplo, un catálogo de productos completo), debería considerar generar el HTML por adelantado en lugar de volver a mostrarlo en respuesta a cada solicitud.
¿Dónde se deben almacenar en caché los datos y qué estrategias de almacenamiento en caché existen? Normalmente, los datos se almacenan en caché en la memoria o el disco del servidor web. Los siguientes dos consejos cubren ambos métodos.
Consejo 2: Almacene en caché los datos utilizados con frecuencia en objetos Aplicación o Sesión.
Los objetos Aplicación y Sesión ASP proporcionan contenedores convenientes para almacenar datos en caché en la memoria. Puede asignar datos a objetos Aplicación y Sesión, y los datos permanecen en la memoria entre llamadas HTTP. Los datos de la sesión se almacenan por separado para cada usuario, mientras que los datos de la aplicación se comparten entre todos los usuarios.
¿Cuándo se deben cargar los datos en la Aplicación o la Sesión? Normalmente, los datos se cargan cuando se inicia la aplicación o la sesión. Para cargar datos durante el inicio de la aplicación o la sesión, agregue el código apropiado a Application_OnStart() o Session_OnStart() respectivamente. Estas funciones deben estar en Global.asa, si no, puedes agregarlas. Estos datos también se pueden cargar la primera vez que se necesitan. Para hacer esto, agregue algo de código a la página ASP (o escriba una función de script reutilizable) para verificar si los datos existen y, si no, cárguelos. Esta es una técnica de rendimiento tradicional llamada "evaluación diferida": no calcular un valor hasta que sepa que lo necesita. Por ejemplo:
<%
Función Obtener lista de estado de empleo
tenue d
d = Solicitud (? Lista de estado de empleo?)
Si d = ??Entonces
' Función FetchEmploymentStatusList (no se muestra)
'obtiene datos de la base de datos, devuelve una matriz
d = FetchEmploymentStatusList()
Solicitud (? Lista de estado de empleo?) = d
Terminar si
Obtener lista de estado de empleo = d
Función final
%>
Se pueden escribir funciones similares para cada bloque de datos requerido.
¿En qué formato se deben almacenar los datos? Se puede almacenar cualquier tipo de variante porque todas las variables del script son tipos de variante. Por ejemplo, puede almacenar cadenas, números enteros o matrices. Normalmente, almacenará el contenido de un conjunto de registros ADO en uno de estos tipos de variables. Para obtener datos de un conjunto de registros ADO, puede copiar manualmente los datos en variables de VBScript, un campo a la vez. Es más rápido y sencillo utilizar una de las funciones de persistencia de conjuntos de registros de ADO GetRows(), GetString() o Save() (ADO 2.5). Los detalles están fuera del alcance de este artículo, pero aquí hay un ejemplo de una función que usa GetRows() para devolver una matriz de datos de conjunto de registros:
' Obtener conjunto de registros, devolver como una matriz
Función FetchEmploymentStatusList
atenuados
Establecer rs = CreateObject(?ADODB.Recordset?)
rs.Open ?seleccione StatusName, StatusID de EmployeeStatus?, _
?dsn=empleados;uid=sa;pwd=;?
FetchEmploymentStatusList = rs.GetRows() ¿Devolver datos como una matriz?
rs.Cerrar
Configurar=Nada
End Function
mejora aún más el ejemplo anterior al almacenar en caché HTML como una lista en lugar de una matriz. A continuación se muestra un ejemplo sencillo:
'Obtener conjunto de registros, devolver como lista de opciones HTML
Función FetchEmploymentStatusList
Dim rs, fldName, s
Establecer rs = CreateObject(?ADODB.Recordset?)
rs.Open ?seleccione StatusName, StatusID de EmployeeStatus?, _
?dsn=empleados;uid=sa;pwd=;?
s = ?<seleccionar nombre=??Estado de empleo??>?
Establecer fldName = rs.Fields(?StatusName?) ' Enlace de campo ADO
Hacer hasta rs.EOF
' La siguiente línea viola Don't Do String Concats,
' pero está bien porque estamos creando un caché
s = s & ? <opción>? & fldNombre & ?</opción>?
rs.MoverSiguiente
Bucle
s = s & ?</select>?
rs.Cerrar
Establecer rs = Nada 'Ver lanzamiento anticipado
FetchEmploymentStatusList = s ' Devuelve datos como una cadena
Función final
En condiciones adecuadas, el conjunto de registros ADO se puede almacenar en caché en el ámbito de Aplicación o Sesión. Hay dos advertencias:
ADO debe marcarse como de subproceso libre y deben usarse conjuntos de registros desconectados.
Si estos dos requisitos no están garantizados, no almacene en caché el conjunto de registros ADO. En los siguientes consejos sobre "Componentes no ágiles" y "No almacenar en caché las conexiones", analizamos los peligros de almacenar objetos COM en el ámbito de Aplicación o Sesión.
Cuando almacena datos en el ámbito de Aplicación o Sesión, los datos permanecen allí hasta que los cambia mediante programación, la sesión caduca o se reinicia la aplicación web. ¿Qué pasa si es necesario actualizar los datos? Para forzar manualmente una actualización de los datos de la aplicación, puede acceder a una página ASP exclusiva para administradores para actualizar los datos. Alternativamente, puede actualizar automáticamente los datos a intervalos regulares a través de una función. El siguiente ejemplo almacena una marca de tiempo con datos almacenados en caché y actualiza los datos después de un cierto período de tiempo.
<%
'No se muestra el error en la entrega...
Const UPDATE_INTERVAL = 300 'Intervalo de actualización, en segundos
' Función para devolver la lista de estado laboral
Función Obtener lista de estado de empleo
Actualizar estado de empleo
GetEmploymentStatusList = Solicitud(?EmploymentStatusList?)
Función final
' Actualiza periódicamente los datos almacenados en caché
SubactualizaciónLista de estado de empleo
Dim d, strLastUpdate
strLastUpdate = Aplicación (? ¿Última actualización?)
Si (strLastUpdate = ??) O _
(UPDATE_INTERVAL < DateDiff(?s?, strLastUpdate, Now)) Then
' Nota: Es posible que entren dos o más llamadas. Esto está bien y simplemente lo hará.
' resulta en algunas recuperaciones innecesarias (hay una solución para esto)
' Función FetchEmploymentStatusList (no se muestra)
'obtiene datos de la base de datos, devuelve una matriz
d = FetchEmploymentStatusList()
'Actualiza el objeto Aplicación. Utiliza Application.Lock().
'para garantizar datos consistentes
Bloqueo de aplicación
Aplicación(?EmploymentStatusList?) = Eventos
Aplicación(?ÚltimaActualización?) = CStr(Ahora)
Aplicación.Desbloquear
Terminar si
Subtítulo final
Consulte el ListBox más rápido del mundo con datos de aplicación, que también tiene un ejemplo.
Tenga en cuenta que almacenar en caché matrices grandes en objetos de sesión o aplicación no es una buena práctica. La sintaxis del lenguaje de secuencias de comandos requiere que toda la matriz se copie temporalmente antes de acceder a cualquier elemento de la matriz. Por ejemplo, si almacena en caché una matriz de cadenas de 100 000 elementos que asigna códigos postales de EE. UU. a estaciones meteorológicas locales en un objeto de aplicación, ASP primero debe copiar las 100 000 estaciones meteorológicas en una matriz temporal. Sólo entonces se puede extraer una cadena. En este caso, sería mejor crear un componente personalizado con un método personalizado para almacenar la estación meteorológica, o utilizar un componente de diccionario.
Sólo otra advertencia: no tire el bebé con el agua del baño: las matrices se pueden buscar rápidamente y almacenar en la memoria como pares de datos clave adyacentes. Indexar un diccionario es mucho más lento que indexar una matriz. Debe elegir la estructura de datos que proporcione el mejor rendimiento para su situación.
Consejo 3: Caché de datos y HTML en el disco del servidor web
A veces puede haber demasiados datos para almacenar en caché en la memoria. "Demasiados" es sólo una forma de decir que depende de cuánta memoria desea consumir, así como de cuántos elementos necesita almacenar en caché y con qué frecuencia desea recuperarlos. En cualquier caso, si hay demasiados datos para almacenarlos en la memoria caché, considere almacenarlos en el disco duro del servidor web como un archivo de texto o XML. Los datos se pueden almacenar en caché en el disco y en la memoria al mismo tiempo para establecer la estrategia de almacenamiento en caché más adecuada para su sitio.
Tenga en cuenta que al medir el rendimiento de una única página ASP, recuperar datos del disco puede no ser necesariamente más rápido que recuperar datos de una base de datos. Pero el almacenamiento en caché reduce la carga de la base de datos y la red. En condiciones de carga pesada, esto puede mejorar enormemente el rendimiento general. Esto es muy eficaz cuando se almacenan en caché los resultados de consultas costosas (como uniones de varias tablas o procedimientos almacenados compuestos) o conjuntos de resultados grandes. Como siempre, pruebe los pros y los contras de varias opciones.
ASP y COM proporcionan herramientas para configurar soluciones de almacenamiento en caché basadas en disco. Las funciones Save() y Open() de conjuntos de registros de ADO guardan y cargan conjuntos de registros desde el disco. Puede utilizar estos métodos para reescribir el ejemplo de código en la técnica de almacenamiento en caché de datos de la aplicación anterior, utilizando Guardar() del archivo en lugar de escribir el código en el objeto Aplicación.
Hay algunos otros componentes que funcionan con archivos:
Scripting.FileSystemObject le permite crear, leer y escribir archivos.
El analizador XML de Microsoft® (MSXML) proporcionado con Internet Explorer admite guardar y cargar documentos XML.
El objeto LookupTable (usado en MSN, por ejemplo) es la mejor opción para cargar listas simples desde el disco.
Finalmente, considere almacenar en caché una representación de los datos en el disco en lugar de los datos en sí. El HTML preconvertido se puede almacenar en el disco en archivos .htm o .asp, y los hipervínculos pueden apuntar directamente a estos archivos. Puede utilizar herramientas comerciales, como XBuilder o la función de publicación en Internet de Microsoft® SQL Server® para automatizar el proceso de generación de HTML. Alternativamente, puedes colocar el fragmento de código HTML en un archivo .asp. También puede usar FileSystemObject para leer archivos HTML desde el disco o usar XML para convertirlos anticipadamente.
Consejo 4: Evite el almacenamiento en caché de componentes no ágiles en objetos de Aplicación o Sesión
Aunque el almacenamiento en caché de datos en objetos de Aplicación o Sesión es una buena práctica, el almacenamiento en caché de objetos COM tiene serios inconvenientes. Normalmente, las personas tienden a almacenar en caché los objetos COM utilizados con frecuencia en objetos de Aplicación o Sesión. Lamentablemente, muchos objetos COM (incluidos todos los objetos escritos en Visual Basic 6.0 o versiones anteriores) provocan graves cuellos de botella cuando se almacenan en objetos Aplicación o Sesión.
Específicamente, cuando cualquier componente no ágil se almacena en caché en el objeto Sesión o Aplicación, provocará un cuello de botella en el rendimiento. Un componente ágil es un componente marcado con ThreadingModel=Both, que agrega un analizador de subprocesos libres (FTM) o un componente marcado con ThreadingModel=Neutral; (El modelo Neutral es nuevo para Windows® 2000 y COM+). Los siguientes componentes no son ágiles:
Componentes de subproceso libre (a menos que agreguen FTM).
Componentes del hilo del apartamento.
Componente de rosca única.
Los componentes configurados (bibliotecas de Microsoft Transaction Server (MTS)/COM+ y paquetes/aplicaciones de servidor) no son ágiles a menos que sean subprocesos neutros. Los componentes con subprocesos separados y otros componentes no ágiles se adaptan mejor al alcance de la página (es decir, se crean y destruyen en una única página ASP).
En IIS 4.0, los componentes marcados con ThreadingModel=Both se consideran ágiles. En IIS 5.0, esto por sí solo no es suficiente. Los componentes no sólo deben estar marcados como Ambos, sino que también deben estar agregados como FTM. El artículo sobre agilidad describe cómo agregar FTM con componentes C++ escritos en la biblioteca de plantillas activas. Tenga en cuenta que si un componente almacena en caché los punteros de la interfaz, esos punteros deben ser ágiles o deben almacenarse en la tabla de interfaz común COM (GIT). Si no puede volver a compilar un componente de ambos subprocesos para agregar FTM, puede marcar el componente con ThreadingModel=Neutral. Alternativamente, si no desea que IIS realice comprobaciones de agilidad (por lo tanto, puede permitir que los componentes no ágiles se almacenen en el ámbito de Aplicación o Sesión), puede configurar AspTrackThreadingModel en True en la metabase. No se recomienda cambiar AspTrackThreadingModel.
IIS 5.0 generará un error si desea almacenar un componente no ágil creado con Server.CreateObject en un objeto Aplicación. Puede evitar este error utilizando <object runat=server range=application ...> en Global.asa, pero no se recomienda ya que puede generar agrupación y serialización, como se describe a continuación.
¿Qué sucede si almacena en caché componentes no ágiles? Los componentes no ágiles almacenados en caché en el objeto Sesión bloquean la sesión en el subproceso de trabajo ASP. ASP mantiene un grupo de subprocesos de trabajo para manejar solicitudes. Normalmente, una nueva solicitud siempre la maneja el primer subproceso de trabajo disponible. Si la sesión está bloqueada en un hilo, la solicitud debe esperar hasta que su hilo asociado esté disponible. Aquí hay una analogía que podría ayudar: vas a un supermercado, eliges algunos artículos y pagas en la caja #_3. A partir de entonces, siempre que pagues un artículo en ese supermercado, siempre tendrás que pagar en la caja #_3, incluso si hay menos colas o ninguna en otras cajas.
Almacenar componentes no ágiles en el ámbito de la aplicación tiene un impacto aún peor en el rendimiento. ASP debe crear un hilo especial para ejecutar componentes no ágiles almacenados en el ámbito de la aplicación. Esto tiene dos consecuencias: todas las llamadas deben canalizarse a este hilo y todas las llamadas se ponen en cola. "Agrupación" significa que los parámetros deben almacenarse en un área compartida de la memoria; realizar un costoso cambio de contexto a un hilo especial; ejecutar el método del componente y agrupar los resultados en el área compartida; al hilo original. "Serialización" significa que sólo se ejecuta un método a la vez. Dos subprocesos de trabajo ASP diferentes no pueden ejecutar varios métodos en un componente compartido simultáneamente. Esto elimina la concurrencia, especialmente en computadoras multiprocesador. Para empeorar las cosas, todos los componentes que no pertenecen al ámbito de la aplicación ágil comparten un único subproceso (el host STA), por lo que el impacto de la serialización es aún más significativo.
¿Qué puedo hacer? Aquí hay algunas reglas generales. Si escribe objetos usando Visual Basic (6.0) o una versión anterior, no los almacene en caché en objetos Aplicación o Sesión. Si no conoce el modelo de subprocesamiento de un objeto, no lo almacene en caché. No almacene en caché objetos no ágiles; en su lugar, créelos y publíquelos en cada página. Los objetos se ejecutan directamente en el subproceso de trabajo de ASP, por lo que no hay agrupación ni serialización. Si los objetos COM se ejecutan en un servidor IIS, el rendimiento es aceptable si no tardan mucho en inicializarse y eliminarse. Tenga en cuenta que los objetos de un solo subproceso no deben usarse de esta manera. Tenga cuidado: ¡VB puede crear objetos de un solo subproceso! Si debe utilizar un objeto de un solo subproceso (como una hoja de cálculo de Microsoft Excel) como este, no espere un alto rendimiento.
Cuando ADO se marca como subproceso libre, los conjuntos de registros ADO se pueden almacenar en caché de forma segura. Para marcar ADO como subproceso libre, utilice el archivo Makfre15.bat, que normalmente se encuentra en el directorio \Program FilesCommonSystemADO.
Advertencia Si utiliza Microsoft Access como base de datos, no debe marcar ADO como subproceso libre. El conjunto de registros ADO también debe estar desconectado. En general, si no controla la configuración de ADO en su sitio (por ejemplo, es un proveedor de software independiente [ISV] que vende aplicaciones web a clientes que administran sus propias configuraciones), es mejor no almacenar en caché los conjuntos de registros.
Los componentes del diccionario también son objetos ágiles. LookupTable carga sus datos desde un archivo de datos y puede usarse para datos de cuadros combinados e información de configuración. El objeto PageCache en Duwamish Books proporciona sintaxis de diccionario, al igual que Caprock Dictionary. Estos objetos o sus objetos derivados pueden formar la base de una estrategia de almacenamiento en caché eficaz. Tenga en cuenta que los objetos Scripting.Dictionary no son ágiles y no deben almacenarse en los ámbitos de Aplicación o Sesión.
Consejo 5: No almacene en caché las conexiones de la base de datos en el objeto Aplicación o Sesión
. El almacenamiento en caché de las conexiones ADO generalmente es una mala estrategia. Si un objeto Conexión se almacena en el objeto Aplicación y se utiliza en todas las páginas, todas las páginas competirán por esta conexión. Si el objeto Conexión se almacena en el objeto Sesión ASP, se creará una conexión de base de datos para cada usuario. Esto anulará las ventajas de la agrupación de conexiones y ejercerá una presión innecesaria sobre el servidor web y la base de datos.
En lugar de almacenar en caché las conexiones de la base de datos, puede crear y eliminar objetos ADO en cada página ASP que utilice ADO. Esto es eficiente porque IIS tiene una agrupación de conexiones de bases de datos incorporada. Para ser más precisos, IIS habilita automáticamente la agrupación de conexiones OLEDB y ODBC. Esto garantiza que las conexiones creadas y eliminadas en cada página serán válidas.
Debido a que el conjunto de registros conectado almacena una referencia a la conexión de la base de datos, no debe almacenar en caché el conjunto de registros conectado en el objeto Aplicación o Sesión. Sin embargo, puede almacenar en caché de forma segura conjuntos de registros desconectados que no contienen una referencia a su conexión de datos. Para desconectar un conjunto de registros, realice los dos pasos siguientes:
Set rs = Server.CreateObject(?ADODB.RecordSet?)
rs.CursorLocation = adUseClient 'paso 1
' Complete el conjunto de registros con datos
rs.Open strQuery, strProv
' Ahora desconecta el conjunto de registros del proveedor de datos y la fuente de datos
rs.ActiveConnection = Nada ' paso 2
Puede encontrar información más detallada sobre la agrupación de conexiones en el material de referencia de ADO y SQL Server.
Consejo 6: Utilice los objetos de sesión correctamente
Ahora que hemos analizado las ventajas del almacenamiento en caché en Aplicaciones y Sesiones, analicemos cómo evitar el uso de objetos de sesión. Como se analiza a continuación, Session tiene varias desventajas cuando se usa con sitios ocupados. "Ocupado" generalmente significa un sitio que requiere cientos de páginas por segundo o miles de usuarios simultáneos. Este consejo es aún más importante para los sitios que deben escalar horizontalmente, es decir, aquellos que utilizan varios servidores para manejar la carga o lograr tolerancia a fallas. Para sitios más pequeños, como sitios de intranet, si desea aprovechar los beneficios que brinda Session, la sobrecarga del sistema inevitablemente aumentará.
En resumen, ASP crea automáticamente una sesión para cada usuario que accede al servidor web. Cada sesión requiere aproximadamente 10 KB de sobrecarga de memoria (lo principal es que los datos se almacenan en la sesión), lo que ralentiza todas las solicitudes. La sesión sigue siendo válida hasta que transcurre el período de tiempo de espera configurado (normalmente 20 minutos).
El mayor problema de Session no es el rendimiento, sino la escalabilidad. La sesión no puede abarcar varios servidores web. Una vez que se crea una sesión en un servidor, sus datos permanecen allí. Esto significa que si utiliza Session en una granja de servidores web, debe diseñar una política que siempre envíe cada solicitud de usuario al servidor donde se encuentra la sesión del usuario. A esto se le llama "pegar" al usuario al servidor web. De aquí se deriva el término "sesión fija". Si el servidor web falla, los usuarios "bloqueados" perderán el estado de su sesión porque la sesión no está bloqueada en el disco.
Las estrategias para lograr sesiones fijas incluyen soluciones de hardware y software. Soluciones como Network Load Balancing en Windows 2000 Advanced Server y Local Director de Cisco pueden implementar sesiones fijas a expensas de cierto grado de escalabilidad. Estas soluciones son imperfectas. No se recomienda implementar su propia solución de software en este momento (solíamos usar filtros ISAPI y transformaciones de URL, etc.).
Los objetos de la aplicación tampoco abarcan varios servidores; si debe compartir y actualizar datos de la aplicación en una granja de servidores web, debe utilizar una base de datos de back-end. Sin embargo, los datos de la aplicación de sólo lectura siguen siendo útiles en una granja de servidores web.
La mayoría de los sitios de misión crítica requieren al menos dos servidores web, aunque sólo sea para aumentar el tiempo de actividad (para manejar la conmutación por error y el mantenimiento del servidor). Por lo tanto, al diseñar aplicaciones de misión crítica, debe implementar "sesiones fijas" o simplemente evitar el uso de sesiones y cualquier otra tecnología de administración de estado que almacene el estado del usuario en un único servidor web.
Si no está utilizando Sesiones, asegúrese de cerrarlas. Puede hacer esto para una aplicación a través del Administrador de servicios de Internet (consulte la documentación de ISM). Si decide utilizar Sessions, existen formas de mitigar su impacto en el rendimiento.
Puede mover contenido que no requiera una sesión (como pantallas de ayuda, áreas de visitantes, etc.) a otra aplicación ASP que tenga la sesión cerrada. Puede indicarle a ASP, página por página, que ya no necesita el objeto Session en esa página, usando la siguiente directiva en la parte superior de la página ASP:
<% @EnableSessionState=False %>
Una buena razón para usar esto La directiva es que esta sesión tiene un problema interesante con los conjuntos de marcos. ASP garantiza que solo se ejecuta una solicitud en la sesión en cualquier momento. Esto garantiza que si el navegador solicita varias páginas para un usuario, solo una solicitud ASP toque la sesión a la vez, evitando así problemas de subprocesos múltiples que ocurren al acceder al objeto de sesión. Desafortunadamente, todas las páginas de un conjunto de marcos se mostrarán en serie, una tras otra, en lugar de hacerlo simultáneamente. Es posible que los usuarios tengan que esperar mucho tiempo para ver todos los fotogramas. Moraleja de la historia: si algunas páginas de conjuntos de marcos no dependen de la sesión, asegúrese de informar a ASP mediante la directiva @EnableSessionState=False.
Hay muchas formas de gestionar el estado de la sesión que pueden reemplazar el uso de objetos de sesión. Para cantidades pequeñas de estado (menos de 4 KB), generalmente recomendamos utilizar cookies, variables QueryString y variables implícitas. Para volúmenes de datos más grandes, como carritos de compras, una base de datos back-end es la opción más adecuada. Se ha escrito mucho sobre técnicas de gestión del estado en granjas de servidores web. Para obtener más información, consulte Referencia del estado de la sesión.
Consejo 7: encapsule el código en objetos COM
Si tiene mucho VBScript o JScript, a menudo puede mejorar el rendimiento moviendo su código a objetos COM compilados. El código compilado suele ejecutarse más rápido que el código interpretado. Los objetos COM compilados pueden acceder a otros objetos COM mediante el "enlace anticipado", que es un método más eficaz para llamar a objetos COM que el "enlace tardío" utilizado por los scripts.
Encapsular código en objetos COM tiene varias ventajas (además del rendimiento):
los objetos COM ayudan a separar la lógica de presentación de la lógica empresarial.
Los objetos COM garantizan la reutilización del código.
Muchos desarrolladores encuentran que el código escrito en VB, C++ o Visual J++ es más fácil de depurar que ASP.
Los objetos COM también tienen desventajas, incluido el tiempo de desarrollo inicial y que requieren diferentes habilidades de programación. Tenga en cuenta que encapsular una pequeña cantidad de ASP puede provocar una degradación del rendimiento sin mejorarlo. Esta situación suele ocurrir cuando se encapsula una pequeña cantidad de código ASP en un objeto COM. En este caso, la sobrecarga de crear y llamar al objeto COM supera las ventajas del código compilado. Se debe utilizar prueba y error para determinar qué combinación de script ASP y código objeto COM produce el mejor rendimiento. Tenga en cuenta que existen mejoras significativas en las secuencias de comandos y el rendimiento de ADO en Windows 2000/IIS 5.0 en comparación con Microsoft Windows NT® 4.0/IIS 4.0. Por lo tanto, con la introducción de IIS 5.0, la ventaja de rendimiento del código compilado sobre el código ASP ha disminuido.
Para obtener una discusión detallada de las ventajas y desventajas de usar COM en ASP, consulte Pautas para componentes ASP y programación de aplicaciones distribuidas con Microsoft Visual Basic 6.0. Si implementa componentes COM, es especialmente importante probarlos bajo carga. De hecho, todas las aplicaciones ASP deben someterse a pruebas de carga como algo natural.
Consejo 8: Obtenga recursos más tarde y publíquelos antes
Aquí tiene un pequeño consejo para su referencia. En términos generales, es mejor obtener recursos más tarde y liberarlos antes. Esto se aplica a los objetos COM, así como a los identificadores de archivos y otros recursos.
Este método de optimización se utiliza principalmente para conexiones y conjuntos de registros ADO. Cuando haya terminado con un conjunto de registros, digamos después de mostrar una tabla y sus datos, debe publicarlo inmediatamente en lugar de esperar hasta el final de la página. Es una buena práctica establecer la variable VBScript en Nada. No permita que un conjunto de registros quede fuera de alcance. Además, libere cualquier objeto Comando o Conexión relacionado (no olvide llamar a Close() antes de configurar el conjunto de registros o la conexión en = Nada). Esto acorta el tiempo que tiene la base de datos para preparar los recursos y libera la conexión de la base de datos al grupo de conexiones lo más rápido posible.
Consejo 9: La ejecución fuera de proceso cambia el rendimiento por la confiabilidad
Tanto ASP como MTS/COM+ tienen opciones de configuración que le permiten compensar la confiabilidad con el rendimiento. Al crear e implementar aplicaciones, debe saber cómo equilibrar el rendimiento con ambos.
Las opciones de ASP configuran las aplicaciones ASP para que se ejecuten de tres maneras. En IIS 5.0, se introdujo el término "nivel de aislamiento" para describir estas opciones. Los tres niveles de aislamiento son nivel bajo, nivel medio y nivel alto:
aislamiento de bajo nivel. Esto es compatible con todas las versiones de IIS y es el más rápido. Ejecuta ASP en Inetinfo.exe, que es el proceso principal de IIS. Si la aplicación ASP falla, IIS también lo hará. (Para reiniciar IIS en IIS 4.0, el administrador del sitio web debe monitorear el sitio usando una herramienta como InetMon y habilitar un archivo por lotes para reiniciar el servidor si el servidor falla. IIS 5.0 introdujo un reinicio confiable, método para reiniciar automáticamente un servidor fallido ).
Aislamiento intermedio. IIS 5.0 introdujo este nuevo nivel, que se denomina nivel fuera de proceso porque ASP se ejecuta fuera del proceso de IIS. En aislamiento intermedio, todas las aplicaciones ASP configuradas para ejecutarse como aislamiento intermedio comparten un espacio de proceso. Esto reduce la cantidad de procesos necesarios para ejecutar múltiples aplicaciones ASP fuera de proceso en un solo servidor. El aislamiento medio es el nivel de aislamiento predeterminado en IIS 5.0.
Aislamiento avanzado. Este nivel es compatible con IIS 4.0 e IIS 5.0, y el aislamiento avanzado también está fuera de proceso. Si ASP falla, el servidor web no falla. La aplicación ASP se reiniciará automáticamente la próxima vez que se realice una solicitud ASP. En aislamiento avanzado, cada aplicación ASP configurada para ejecutarse como aislamiento avanzado se ejecuta en su propio espacio de proceso. Hacer esto evita que las aplicaciones ASP interfieran entre sí. La desventaja es que requiere un proceso separado para cada aplicación ASP. Cuando muchas aplicaciones deben ejecutarse en un único servidor, la sobrecarga del sistema aumenta significativamente.
¿Qué opción es mejor? En IIS 4.0, quedarse sin proceso reducirá significativamente el rendimiento. En IIS 5.0, se han realizado muchas mejoras para minimizar la sobrecarga causada por la ejecución de aplicaciones ASP fuera de proceso. De hecho, en la gran mayoría de las pruebas, las aplicaciones ASP fuera de proceso en IIS 5.0 se ejecutaron más rápido que las aplicaciones en proceso en IIS 4.0. De todos modos, en ambas plataformas, el proceso en proceso (bajo nivel de aislamiento) funciona mejor. Sin embargo, si la tasa de acceso es relativamente baja o el rendimiento máximo es bajo, las ventajas de un nivel de aislamiento bajo son menos obvias. Por lo tanto, es posible que sólo sea necesario establecer un nivel de aislamiento bajo si necesita cientos o miles de páginas por segundo por servidor web. Como siempre, pruebe varias configuraciones para determinar qué compromiso desea hacer.
Tenga en cuenta que cuando ejecuta aplicaciones ASP fuera de proceso (aislamiento medio o alto), se ejecutan en MTS en NT4 y en COM+ en Windows 2000. Es decir, en NT4 se ejecutan en Mtx.exe; en Windows 2000, se ejecutan en DllHost.exe. Puede ver estos procesos ejecutándose en el Administrador de tareas. También puede ver cómo IIS configura un paquete MTS o una aplicación COM+ para una aplicación ASP fuera de proceso.
Opciones COM Los componentes COM también tienen tres opciones de configuración, aunque no son exactamente similares a las opciones ASP. Los componentes COM se pueden "desconfigurar", configurar como una aplicación de biblioteca o configurar como una aplicación de servidor. "Sin configurar" significa que el componente no está registrado en COM+. Los componentes se ejecutarán en el espacio de proceso del programa que los llama, es decir, están "en proceso". Las aplicaciones de biblioteca también están en proceso, pero utilizan servicios COM+, que incluyen seguridad, transacciones y soporte contextual. Las aplicaciones de servidor están configuradas para ejecutarse dentro de su propio espacio de proceso.
Puede ver que los componentes no configurados tienen ligeras ventajas sobre las aplicaciones de biblioteca. Las aplicaciones de biblioteca tienen mayores ventajas de rendimiento que las aplicaciones de servidor. Esto se debe a que las aplicaciones de biblioteca se ejecutan en el mismo proceso que ASP, mientras que las aplicaciones de servidor se ejecutan en sus propios procesos. Las llamadas entre procesos son más caras que las llamadas dentro de procesos. Además, al pasar datos como conjuntos de registros entre procesos, todos los datos deben copiarse entre los dos procesos.
¡trampa! Cuando utilice una aplicación de servidor COM, si pasa objetos entre ASP y COM, asegúrese de que los objetos realicen "agrupación por valor" o MBV. Los objetos que realizan MBV se copian a sí mismos de un proceso a otro. Esto es mejor que un enfoque en el que el objeto todavía está en el proceso del creador y otro proceso llama repetidamente al proceso de creación para utilizar el objeto. Un conjunto de registros ADO desconectado se "agrupará por valor", mientras que un conjunto de registros conectado no. Scripting.Dictionary no realiza MBV y no se pasa entre procesos. Finalmente, una nota para los programadores de VB: MBV no se obtiene pasando el parámetro ByVal. MBV lo realiza el autor del componente original.
¿Qué hacer?
Si nos pidieran que sugiéramos una configuración razonable que equilibre rendimiento y confiabilidad, sería la siguiente:
En IIS 4.0, use ASP de bajo nivel de aislamiento y use el paquete de servidor MTS.
En IIS 5.0, utilice el nivel de aislamiento medio de ASP y utilice una aplicación de biblioteca COM+.
Estos son principios muy generales; las empresas de alojamiento normalmente ejecutan ASP con niveles de aislamiento medios o altos, mientras que los servidores web de propósito único pueden ejecutarse con niveles de aislamiento bajos. Sopese los pros y los contras y decida usted mismo qué configuración se adapta mejor a sus necesidades.
Consejo 10: Use opciones explícitas de
opciones explícitas se deben usar en archivos .asp. Esta directiva se coloca en la parte superior del archivo .asp y obliga al desarrollador a declarar todas las variables que se utilizarán. Muchos programadores consideran que este método es útil en las aplicaciones de depuración porque evita la posibilidad de disimular los nombres de las variables y crear accidentalmente nuevas variables (por ejemplo, myxmlString =) en lugar de myxlmstring = ....
Quizás lo más importante, las variables declaradas son más rápidas que las variables no declaradas. De esta manera, cada vez que el script usa una variable no declarada en tiempo de ejecución, la hace referencia por nombre. Por otro lado, las variables se declaran en orden, ya sea en tiempo de compilación o tiempo de ejecución. De ahora en adelante, las variables declaradas se hacen referencia en este orden. Debido a la declaración de las fuerzas explícitas de opción, garantiza que se declaren todas las variables, por lo que el acceso es rápido.
Consejo 11: Use variables locales en subrutinas y funciones,
las variables locales son aquellas variables declaradas dentro de las subrutinas y funciones. Dentro de una función o subrutina, el acceso a la variable local es más rápido que el acceso a la variable global. El uso de variables locales también aclarará el código, por lo que las variables locales deben usarse siempre que sea posible.
Consejo 12: Copie los datos utilizados con frecuencia en las variables de script
Al acceder a los objetos COM en ASP, los datos de objetos de uso frecuente deben copiarse en las variables de script. Hacer esto reduce las llamadas del método COM, que son relativamente caras en comparación con el acceso a las variables de script. Esta técnica también reduce las búsqueda costosas al acceder a los objetos de recolección y diccionario.
En general, si planea acceder a los datos de objetos más de una vez, debe poner los datos en las variables de script. El objetivo principal de esta optimización son las variables de solicitud (variables de formulario y consulta). Por ejemplo, su sitio puede pasar una variable de consulta llamada UserID. Digamos que este ID de usuario se hace referencia 12 veces en una página en particular. En lugar de llamar a la solicitud (? DeseuDid?) 12 veces, puede asignar INSUMID a una variable en la parte superior de la página ASP. Luego use esa variable en toda la página. Esto guarda 11 llamadas de método COM.
De hecho, acceder a las propiedades o métodos COM no es tan costoso. Aquí hay un ejemplo de algún código bastante común (sintácticamente hablando):
foo.bar.blah.baz = foo.bar.blah.qaz (1)
Si foo.bar.blah.zaq = foo.bar.blah.abc entonces '...
Cuando se ejecuta este código, esto es lo que sucede:
la variable FOO se resuelve a un objeto global.
La barra variable se resuelve como miembro de Foo. Esta es en realidad una llamada de método COM.
La variable BLA se resuelve como miembro de Foo.Bar. Esta es otra llamada de método COM.
La variable QAZ se resuelve como miembro de Foo.Bar.Blah. Así es, esta sigue siendo una llamada de método COM.
Llame a foo.bar.blah.quaz (1). Otra llamada de método COM. ¿Entiendo?
Realice los pasos 1 a 3 nuevamente para analizar Baz. El sistema no sabe si llamar a QAZ cambia el modelo de objeto, por lo que los pasos 1 a 3 deben realizarse nuevamente para resolver BAZ.
Resolver a Baz como miembro de Foo.Bar.Blah. Asignar atributos.
Realice los pasos 1 a 3 nuevamente para analizar Zaq.
Realice los pasos 1 a 3 nuevamente para analizar ABC.
Como puede ver, la eficiencia es bastante pobre (y lenta). Una forma rápida de escribir este código en VBScript es:
Establecer myobj = foo.bar.blah 'haz la resolución de bla una vez
Myobj.baz = myobj.qaz (1)
Si myobj.zaq = myobj.abc entonces '...
Si está utilizando VBScript 5.0 o superior, puede escribir este código utilizando con la declaración:
con foo.bar.blah
.baz = .qaz (1)
If .zaq = .abc entonces '...
...
Termine con
nota que esta técnica también se aplica a la programación de VB.
Consejo 13: Evite la re-dimensionar las matrices
de redim las matrices se deben evitar si es posible. En términos de rendimiento, si la computadora tiene un tamaño de memoria física limitado, es mejor establecer la dimensionalidad inicial de la matriz en su peor escenario, o establecer las dimensiones en su mejor escenario, y luego volver a dimensionarla según sea necesario. Esto no significa solo asignar algunos megabytes de la memoria cuando sabes que no la necesitarás.
El siguiente código le muestra un uso inapropiado de DIM y redim.
<%
DimmyArray ()
RedimmyArray (2)
MyArray (0) =? ¿Hola?
MyArray (1) =? ¿Adiós?
MyArray (2) =? Adiós?
...
'Algún otro código donde terminas necesitando más espacio, luego ...
Redim preserva myArray (5)
MyArray (3) =? ¿Más cosas?
MyArray (4) =? ¿Incluso más cosas?
MyArray (5) =? ¿Aún más cosas?
%>
Es mucho mejor atenuar el tamaño inicial de la matriz correctamente desde el principio (en este caso, 5) que para redimir la matriz para hacerlo más grande. Puede desperdiciar algo de memoria (si no usa todos los elementos), pero el beneficio es que se vuelve más rápido.
Consejo 14: Use el almacenamiento en búfer de respuesta,
puede amortiguar una página completa de salida al habilitar el "búfer de respuesta". Esto minimiza la cantidad de escritura al navegador, mejorando el rendimiento general. Cada operación de escritura incurre en sobrecarga significativa (tanto en II como en términos de la cantidad de datos enviados a través de la red), por lo que cuanto menos escriba, mejor. Debido a su inicio lento y su uso del algoritmo de Nagling (utilizado para aliviar la congestión de la red), TCP/IP es mucho más eficiente cuando se envía algunas grandes fragmentos de datos que cuando debe enviar muchos trozos pequeños.
Hay dos formas de habilitar el almacenamiento en búfer de respuesta. Primero, puede usar Internet Services Manager para habilitar el almacenamiento en búfer de respuesta para toda la aplicación. Recomendamos este enfoque, habilitando el almacenamiento en búfer de respuesta de forma predeterminada para nuevas aplicaciones ASP en IIS 4.0 e IIS 5.0. En segundo lugar, puede habilitar el almacenamiento en búfer de respuesta agregando la siguiente línea de código cerca de la parte superior de cada página ASP:
< % Response.Buffer = True %>
Esta línea de código debe ejecutarse antes de que se escriban los datos de respuesta al navegador (es decir, antes de que aparezca cualquier HTML en el script ASP y antes de que se establezcan cualquier cookies utilizando la colección Response.Cookies). En general, es mejor habilitar el almacenamiento en búfer de respuesta para toda la aplicación. De esta manera, no tiene que escribir la línea de código anterior en la parte superior de cada página.
Respuesta.Flush
Una queja común sobre el almacenamiento en búfer de respuesta es que los usuarios perciben que las páginas de ASP son lentas para responder (aunque se mejore el tiempo de respuesta general) porque tienen que esperar hasta que se genere toda la página antes de que puedan ver algo. Para las páginas de larga duración, puede establecer respuesta. Buffer = false para deshabilitar el almacenamiento en búfer de respuesta. Sin embargo, una mejor estrategia es utilizar el método de respuesta. Este método envía todo HTML convertido por ASP al navegador. Por ejemplo, después de convertir las primeras 100 filas de una tabla de 1,000 filas, ASP puede llamar a respuesta. Flush para forzar los resultados de la conversión al navegador, lo que permite al usuario ver las primeras 100 filas antes de que las filas restantes estén listas. Esta técnica combina perfectamente el almacenamiento en búfer de respuesta con el navegador que muestra gradualmente los datos.
(Tenga en cuenta que en el ejemplo de la tabla de 1,000 filas arriba, muchos navegadores no comenzarán a mostrar la tabla hasta que vean la etiqueta de cierre </table>. Verifique si su navegador objetivo lo admite. Para evitar esto, divide la tabla en múltiples tablas con Menos filas y respuesta de llamadas. Flush después de cada tabla. El ancho de contenido de cada celda).
Otra queja común sobre el almacenamiento en búfer de respuesta es que ocupa mucha memoria del servidor cuando se producen páginas muy grandes. Independientemente del método para generar páginas grandes, este problema también se puede resolver mediante el uso inteligente de la respuesta.
Consejo 15: Scripts y respuesta incrustados por lotes. Escritue la
sintaxis VBScript < % = expresión %> Escriba el valor de "expresión" en la secuencia de salida ASP. Si el almacenamiento en búfer de respuesta no está habilitado, cada declaración ejecutada escribirá datos en el navegador en muchos paquetes pequeños a través de la red. Esto es muy lento. Además, la ejecución intercalada de una pequeña cantidad de scripts y HTML causará conmutación entre el motor de script y HTML, reduciendo así el rendimiento. Por lo tanto, use el siguiente truco: use Respuesta. Escribe llamadas en lugar de expresiones en línea ajustadas. Por ejemplo, en el siguiente ejemplo, hay una escritura en el flujo de respuesta por campo por fila, y hay muchos interruptores entre VBScript y HTML por fila:
<able>
< % Para cada FLD en Rs.Fields %>
<th> < % = fld.name %> </th>
<%
Próximo
Mientras que no rs.eof
%>
<tr>
< % Para cada FLD en Rs.Fields %>
<TD> < % = fld.Value %> </td>
<% Siguiente
</tr>
<% Rs.Movenext
Venir %>
</tabla>
El siguiente código es más eficiente, con una escritura en el flujo de respuesta por línea. Todo el código está contenido en un bloque VBScript:
<Able>
<%
Para cada FLD en Rs. Fields
Response.write (? <th>? & Fld.name &? </th>? & Vbcrlf)
Próximo
Mientras que no rs.eof
Response.write (? <tr>?)
Para cada FLD en Rs.Fields %>
Response.Write (? <TD>? & Fld.Value &? </td>? & Vbcrlf)
Próximo
Response.write? </tr>?
Encaminarse a
%>
</tabla>
Este truco funciona especialmente bien cuando el búfer de respuesta está deshabilitado. Es una buena idea habilitar el almacenamiento en búfer de respuesta y ver si la respuesta por lotes. Write ayuda a mejorar el rendimiento.
(
aunque no Rs.Eof ...) puede reemplazarse con una llamada GetString cuidadosamente construida).
hacer si los usuarios están impacientes antes de usar la respuesta. ISCLIENT CONNECTED
, pueden abandonar la página ASP antes de comenzar a ejecutar su solicitud. Si hacen clic en Actualizar o moverse a otra página del servidor, hay una nueva solicitud que espera al final de la cola de solicitud de ASP y una solicitud desconectada en el medio de la cola. Esto a menudo sucede cuando la carga en el servidor es alta (y, por lo tanto, la cola de solicitud es larga y los tiempos de respuesta son correspondientemente largos), lo que solo empeora la situación. No tiene sentido ejecutar páginas ASP (especialmente páginas ASP lentas y grandes) si el usuario ya no está conectado. Puede verificar esto utilizando la propiedad de respuesta. Si devuelve falso, se debe llamar a la respuesta.end y el resto de la página debe descartarse. De hecho, IIS 5.0 tiene este comportamiento programado: cada vez que ASP está a punto de ejecutar una nueva solicitud, verifica cuánto tiempo la solicitud ha estado esperando en la cola. Si ha estado esperando allí durante más de 3 segundos, ASP verificará si el cliente todavía está conectado y, si no, rescindir la solicitud de inmediato. Puede ajustar el tiempo de espera de 3 segundos a otro valor utilizando la configuración AspqueueConnectionTesttime en la metabase.
También puede verificar la respuesta. ISCLIENT CONSECTECTED de vez en cuando si la página tarda mucho en completarse. Cuando el almacenamiento en búfer de respuesta está habilitado, es una buena idea realizar una respuesta. De vez en cuando, de vez en cuando para que el usuario sepa lo que está sucediendo.
Tenga en cuenta que en IIS 4.0, Response.IsClientConnected no funcionará correctamente a menos que la respuesta. Write se ejecuta primero. Si el búfer está habilitado, también debe realizar la respuesta. Flush. En IIS 5.0, no hay necesidad de hacer esto: respuesta. IsclientConnected funciona bien. En cualquier caso, Respuesta.IsclientConnected tendrá algunas sobrecargas, por lo que solo si una operación toma al menos (digamos) 500 milisegundos (mucho tiempo si desea mantener un rendimiento de decenas de páginas por segundo) simplemente úselo. La experiencia muestra que no debe llamarlo cada vez que se ejecute repetidamente un bucle apretado, como cuando se muestra muchas filas de una mesa, llamándolo cada veinte o cincuenta filas puede ser apropiado.
Consejo 17: Use la etiqueta <S Object> para objetos instanciados
Si desea hacer referencia a un objeto que no se usa en todas las rutas de código (especialmente objetos de servidor o aplicación), use el <objeto runat = servidor ID = objname> etiqueta Declaración en Global.AsA ellos en lugar de usar el método Server.CreateObject. Server.CreateObject crea objetos de inmediato. Si no usa el objeto en el futuro, ha desperdiciado recursos. La etiqueta <Object id = objname> declara objname, pero el objname no se crea hasta que su método o propiedad se use por primera vez.
Este es otro ejemplo de evaluación perezosa.
Consejo 18: Use declaraciones de typelib para ADO y otros componentes
Cuando usan ADO, los desarrolladores a menudo agregan ADOVBS.txt para acceder a varias constantes de ADO. Este archivo debe incluirse en cada página donde se utilicen constantes. Este archivo constante es bastante grande, lo que agrega muchas sobrecargas al tiempo de compilación y el tamaño del script de cada página ASP.
IIS 5.0 introdujo la capacidad de unirse a las bibliotecas de tipo componente. Esto le permite hacer referencia a la biblioteca de tipos una vez y usarla en cada página ASP. No hay sobrecarga de compilar archivos constantes para cada página, y los desarrolladores de componentes no tienen que crear archivos VBScript#_Include para su uso en ASP.
Para acceder a ADO typelib, coloque la siguiente declaración en Global.asa.
<!- metadata name =? Microsoft ActiveX Data Objects 2.5 Biblioteca?
Type =? Typelib?
o
<!- metadata type =? typelib?
Archivo =? C: Archivos de programa Archivos comunes System ADO
MSADE15.DLL
? Los servicios brindan soporte. Use estas características siempre que sea posible. Todas estas tecnologías realizan validación del lado del cliente y almacenamiento en caché de datos, eliminando la necesidad de un viaje de ida y vuelta al servidor web. Si está ejecutando un navegador inteligente, el navegador puede hacer alguna validación por usted (por ejemplo, verificar que una suma de verificación de tarjeta de crédito es válida antes de realizar una publicación). Use esta función siempre que sea posible. Al reducir los viajes de ida y vuelta de cliente cliente, reduce la carga en el servidor web y reduce el tráfico de red (aunque la primera página enviada al navegador puede ser mayor) y cualquier recurso de fondo accedido por el servidor. Además, el usuario no tiene que leer una nueva página como de costumbre, por lo que el usuario se siente mejor. Hacer esto no significa que pueda omitir la validación del lado del servidor: siempre debe hacer la validación del lado del servidor. Esto evita que el cliente genere datos incorrectos por alguna razón (como un hacker, o el navegador que no ejecuta rutinas de validación del lado del cliente).
Se ha realizado mucho trabajo para desarrollar HTML "independiente del navegador". Debido a esta preocupación, los desarrolladores son reacios a usar características populares del navegador que podrían mejorar el rendimiento. Para algunos sitios verdaderamente de alto rendimiento, los problemas de "acceso" del navegador deben preocuparse, y una buena estrategia es optimizar la página para adaptarla a los navegadores populares. Las capacidades del navegador se pueden detectar fácilmente en ASP utilizando el componente de capacidades del navegador. Herramientas como Microsoft FrontPage Ayuda de diseño de diseño que es apropiado para el navegador y la versión específica de HTML. ¿Ves cuándo es mejor peor? Sopesando las compensaciones de tecnología para una mayor discusión.
Consejo 20: Evite usar la concatenación de la cadena en un bucle
, muchas personas crean una cadena en un bucle, como este:
S =? <Table>?
Para cada FLD en Rs. Fields
S = S &?
Siguiente
mientras no Rs.EOF
S = S & VBCRLF &?
Para cada FLD en Rs. Fields
S = S &?
Próximo
S = S &?
rs.MoverSiguiente
Wend
S = S & VBCRLF &? </Table>?
Respuesta.WRITE S
Surgen algunos problemas con este enfoque. El primer problema es que las cadenas concatenadas repetidamente requieren tiempo para el poder de dos. Un ejemplo más simple ilustrará este problema más claramente.
S = ??
Para i = asc (? A?) A asc (? Z?)
S = S & chr (i)
Próximo
En la primera iteración, ¿obtienes una cadena de un personaje? A?. En la segunda iteración, VBScript debe reasignar la cadena y copiar dos caracteres (? AB?) En s. En la tercera iteración, también debe reasignar S nuevamente y copiar tres caracteres en s. En n (26) iteraciones, debe reasignar y copiar N caracteres en s. El total es 1+2+3+...+n, es decir, n*(n+1)/2 copias.
En el ejemplo de registro anterior, si hay 100 registros y 5 campos, el bucle interno se ejecutará 100*5 = 500 veces, y el tiempo dedicado a toda copia y reasignación es proporcional a 500*500 = 250,000. Esta es demasiadas operaciones de copia para un conjunto de registros de tamaño moderado.
En este caso, el código podría mejorarse usando Response.Write () o Scripting en línea (< % = Fld.Value %>) en lugar de la concatenación de cadenas. Si el almacenamiento en búfer de respuesta está habilitado (debería), esto será más rápido porque Response.WRITE solo agrega los datos al final del búfer de respuesta. No hay una reasignación involucrada, por lo que es muy eficiente.
En el caso específico de convertir un conjunto de registros ADO en una tabla HTML, debe considerar usar GetRows o GetTring.
Si está concatenando cadenas en JScript, se recomienda particularmente usar el operador +=, es decir, usar S +=? Una cadena en lugar de S = S +? ¿Una cadena?
Consejo 21: Habilitar el almacenamiento en caché del navegador y el proxy
de forma predeterminada, ASP deshabilita el almacenamiento en caché en navegadores y proxies. Esto tiene sentido porque las páginas ASP son, por naturaleza, dinámicas, con información subyacente que cambia con el tiempo. Si la página no requiere una actualización en cada vista, debe habilitar el almacenamiento en caché del navegador y el proxy. Esto permite que los navegadores y los proxies usen una copia "en caché" de la página durante un cierto período de tiempo, cuya longitud puede controlar. El almacenamiento en caché puede reducir en gran medida la carga en el servidor y acortar el tiempo de espera del usuario.
¿Qué página dinámica se puede usar como una página para almacenar en caché? Aquí hay algunos ejemplos:
página de pronóstico del tiempo, en esta página, el pronóstico del tiempo se actualiza cada 5 minutos.
Página de inicio Listado de noticias o lanzamientos, actualizados dos veces al día.
Una lista del rendimiento del fondo mutuo donde las estadísticas básicas se actualizan cada pocas horas.
Tenga en cuenta que cuando se usa almacenamiento en caché del navegador o proxy, se reduce el número de visitas registradas en el servidor web. Si desea medir con precisión todas las vistas o publicaciones de la página, no desea usar el almacenamiento en caché del navegador y el proxy.
El almacenamiento en caché del navegador está controlado por el encabezado HTTP "Expiration", que el servidor web envía al navegador. ASP proporciona dos mecanismos simples para enviar este encabezado. Para establecer el número de minutos después de lo cual expirará una página, establezca la propiedad Response.Expires. El siguiente ejemplo le dice al navegador que el contenido expira en 10 minutos:
< % Respuesta. EXPRIRES = 10 %>
Configuración de respuesta. Expira a un número negativo o 0 deshabilita el almacenamiento en caché. Asegúrese de usar un gran número negativo, como -1000 (un poco más de un día) para evitar un desajuste entre los relojes del servidor y el navegador. La segunda propiedad, Response.ExireSabsolute, le permitirá establecer el tiempo específico cuando el contenido caducará:
< % Response.ExireSabsolute = # May 31,2001 13: 30: 15 # %>
En lugar de usar el objeto de respuesta para establecer el tiempo de caducidad, puede escribir la etiqueta <SetA> en el HTML, generalmente en la sección <BEAD> del archivo HTML. Algunos navegadores respetarán esta directiva, mientras que los proxies no lo harán.
<Meta http-oquiv =? Valor?
Finalmente, puede usar la propiedad Response.Cachecontrol para indicar si su contenido puede ser almacenado en caché por un proxy HTTP. Establecer esta propiedad en "Public" permite que el proxy almacene en caché este contenido.
< % Respuesta.Cachecontrol =? Público?
Por defecto, esta propiedad está configurada en "Privado". Tenga en cuenta que el almacenamiento en caché del proxy no debe habilitarse para páginas que muestren datos específicos para un usuario, ya que el proxy puede servir a las páginas del usuario que pertenecen a otros usuarios.
Consejo 22: use server.transfer en lugar de respuesta. Redirect siempre que sea posible
. Esta función se usa comúnmente para redirigir al usuario a una página de inicio de sesión o error. Debido a que la redirección obliga a una solicitud de una nueva página, el resultado es que el navegador debe hacer dos viajes redondos al servidor web, y el servidor web debe manejar una solicitud más. IIS 5.0 presenta un nuevo servidor de funciones. Transfer, que transfiere la ejecución a otra página ASP en el mismo servidor. Esto evita los viajes redondos redundantes del navegador-WEB-server, mejorando el rendimiento general del sistema y el tiempo de respuesta del usuario. Verifique la "nueva dirección" en "Redirect", debe ser server.transfer y server.execute.
Consulte también Aprovechar ASP en IIS 5.0 para obtener una lista completa de nuevas características en IIS 5.0 y ASP 3.0.
Consejo 23: Use una barra de invertir en las URL de directorio.
Un consejo relacionado es asegurarse de usar una barra inalcadora (/) en URL que apuntan a directorios. Si omite la barra de arrastre, el navegador hará una solicitud al servidor solo para decirle al servidor que está solicitando un directorio. El navegador realiza una segunda solicitud, que agrega un corte a la URL, y solo entonces puede el servidor responder con el documento o la lista predeterminada del directorio (si no hay un documento predeterminado y la navegación del directorio está habilitada). Añadir la barra de corte elimina el primer regreso inútil. Para facilitar la lectura de los usuarios, se puede omitir la barra de corte en el nombre de la pantalla.
Por ejemplo, escriba:
<a href =? Http: //msdn.microsoft.com/workshop/? Title =? Msdn web
Taller?> Http://msdn.microsoft.com/workshop </a>
Esto también se aplica a las URL que apuntan a la página de inicio en un sitio web: use lo siguiente: <a href =? Http: //msdn.microsoft.com/?> En lugar de <a href =? Http: //msdn.microsoft .
Consejo 24: Evite usar variables del servidor
. La situación es similar a la búsqueda de un archivo en una carpeta en un ático mohoso. Cuando desee encontrar ese documento, debe ir al ático, encontrar la carpeta y luego encontrar el documento. Lo mismo ocurre cuando solicita una variable de servidor: la primera vez que solicita una variable de servidor, el rendimiento sufre. Las solicitudes posteriores a otras variables del servidor no tendrán un impacto en el rendimiento.
Nunca acceda a un objeto de solicitud no calificado (por ejemplo, solicitud ("datos")). Sold.ServerVariables se llama implícitamente los elementos que no están en request.cookies, request.form, request.Querystring o request.clientCertificate. La colección Soly.ServerVariables es mucho más lenta que otras colecciones.
Consejo 25: Actualizar a los últimos y mejores
componentes del sistema es una constante, y le recomendamos que los actualice a las más últimas y mejores configuraciones. Es mejor actualizar a Windows 2000 (y por lo tanto IIS 5.0, ADO 2.5, MSXML 2.5, Internet Explorer 5.0, VBScript 5.1 y JScript 5.1). En computadoras multiprocesador, la implementación de IIS 5.0 y ADO 2.5 puede mejorar significativamente el rendimiento. Bajo Windows 2000, ASP escala bien a cuatro procesadores o más, mientras que bajo IIS 4.0, ASP no escala más allá de dos procesadores. Cuanto más código de secuencias de comandos y ADO use en su aplicación, más mejoras de rendimiento experimentará después de actualizar a Windows 2000.
Si aún no puede actualizarse a Windows 2000, puede actualizar a las últimas versiones de SQL Server, ADO, VBScript y JScript, MSXML, Internet Explorer y NT 4 Service Packs. Ambos mejoran el rendimiento y la fiabilidad.
Consejo 26: Optimizar el servidor web
Hay varios parámetros de optimización de IIS que pueden mejorar el rendimiento del sitio. Por ejemplo, con IIS 4.0, a menudo encontramos que aumentar el parámetro ASP Processorthreadmax (ver la documentación de IIS) puede mejorar significativamente el rendimiento, especialmente en sitios que tienden a esperar los recursos de fondo (como bases de datos) u otros productos intermedios (como como cepillos de pantalla). En IIS 5.0, puede encontrar que habilitar la activación de hilos ASP es más eficiente que encontrar una configuración óptima para AspProcessorthreadmax, que ahora es bien conocida.
Para una buena referencia, vea la optimización de IIS a continuación.
La configuración de configuración óptima depende, entre otros factores, el código de aplicación, el hardware del sistema en el que se ejecuta y la carga de trabajo del cliente. La única forma de encontrar la mejor configuración es realizar pruebas de rendimiento, que discutiremos en el próximo consejo.
Consejo 27: Realizar pruebas de rendimiento
Como hemos dicho antes, el rendimiento es una característica. Si desea mejorar el rendimiento de su sitio, establezca un objetivo de rendimiento y mejore gradualmente hasta que lo alcance. No, no se realizarán pruebas de rendimiento. A menudo, al final del proyecto, es demasiado tarde para hacer los cambios estructurales necesarios, y su cliente se sentirá decepcionado. Realice pruebas de rendimiento como parte de su rutina de pruebas. Puede realizar pruebas de rendimiento en componentes individuales individualmente, como páginas ASP o objetos COM, o en el sitio en su conjunto.
Muchas personas usan un solo navegador para solicitar una página para probar el rendimiento de un sitio web. Hacer esto le dará la sensación de que su sitio responde, pero en realidad no le dirá cómo su sitio funciona bajo carga.
Por lo general, para probar con precisión el rendimiento, necesita un entorno de prueba dedicado. Este entorno debe incluir hardware similar al entorno de producción en términos de velocidad del procesador, número de procesadores, memoria, discos, configuración de red, etc. En segundo lugar, debe especificar la carga de trabajo del cliente: cuántos usuarios simultáneos hay, con qué frecuencia realizan solicitudes, en qué tipos de páginas hacen clic, etc. Si no tiene datos sobre el uso real del sitio, debe estimar el uso. Finalmente, necesita una herramienta que pueda simular las cargas de trabajo del cliente esperadas. Con estas herramientas, puede comenzar a responder preguntas como "Si tengo n usuarios simultáneos, ¿cuántos servidores necesitaré?" También puede identificar las causas de los cuellos de botella y optimizar contra ellos.
A continuación se enumeran algunas buenas herramientas de prueba de carga web. Recomendamos particularmente el kit de herramientas de estrés de aplicación web de Microsoft (WAS). Le permitió grabar scripts de prueba y luego simular cientos o miles de usuarios que acceden a un servidor web. Fue informa una serie de estadísticas, incluidas solicitudes por segundo, distribución del tiempo de respuesta y recuentos de errores. WAS está disponible tanto en una interfaz de cliente rico como en una interfaz basada en la web que le permite realizar pruebas remotas.
Asegúrese de leer la guía de ajuste IIS 5.0.
Consejo 28: Lea los enlaces de recursos
a continuación son enlaces a algunos recursos geniales relacionados con el rendimiento. Si desea conocerlo, lea el desarrollo de aplicaciones web escalables.
¿
Optimizaciónde
recursosASP
Scripts que desarrolla aplicaciones web escalables
obtuvieron alguna memoria caché
?
,Recursos de velocidad y optimización
de Nancy Winnick Cluts
,optimizando IIS
por Charles CarrollEl arte y la ciencia del servidor web Tuning con Servicios de información de Internet 5.0
Aprovechando el ASP en IIS 5.0,
ajustando IIS 4.0 para sitios de alto volumen de JD Meier, Tuning Internet Information Rendimiento del servidor por Michael Stephenson
,navegando el laberinto de la configuración para la optimización del rendimiento del servidor web
por Mike Moore
,Administración de Internet Information Server 4.0 para el rendimiento de Todd Wanke,
ADO y SQL Server
por Hans HugliTop Diez Tips: Acceder a SQL a través de ADO
y ASP, mejorando,mejorando El rendimiento de su aplicación MDAC por
JD Meier
,que se acumula en los componentes de acceso a datos de Microsoft por Suresh Kannan,
SQL Server: Performance Benchmarks and Guides de
Leland Ahlbeck y Don Willsmejoran el rendimiento de los componentes de acceso a datos con IIS 4.0,
Componentes de acceso a datos de Microsoft ( MDAC) y ActiveX Data Objects (ADO) Consejos de rendimiento de Leland Ahlbeck,
Microsoft
SQL Server 7.0 Tinte y optimización práctica de rendimiento: la perspectiva del servidor de Leland Ahlbeck,
Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - La perspectiva del servidor de Damien Lindauer - El Perspectiva de la aplicación por Damien Lindauer
Accede a registros a través de Internet por Dino Esposito
ASP
Componentes Directrices por JD Meier
Q243548: Información: Directrices de diseño para componentes VB bajo
modelos
de subprocesos ASPexplicados por Nancy Winnick Cluts
So Happy juntos
.Componentes activos del servidor con ATL por
Nancy Winnick Cluts
, agilidad en los componentes del servidor por George Reilly,construyendo componentes de nivel medio de alto rendimiento con C ++ de
Neil Allain
,Páginas de servidor activas y com de Jon Flandes Apartments, de Don Box,
House of Com: Páginas Active Server, de Don Box,
House of Com: Contexts, by Don Box,
House of Com: Completaciones de rendimiento del entorno de ejecución de componentes de Windows 2000, de Don Box,
construyendo componentes COM que aprovechan al máximo Visual Basic y secuencias de comandos , por IVO Salmre
PRINCIPIOS DE DESEJO DE COMPONENTES PARA MTS
COMPONENTO DE DICCIONARIO
Crear un objeto de caché de página, por Robert Coleridge
que abrevia el objeto del diccionario: el equipo ASP crea un objeto de mesa de búsqueda, por Robert Carter
Caprock Dictionary
Site Server Commerce Edition incluye un
estado de sesión
de componente diccionario.P175167: Cómo:: Valores persistentes sin sesiones
Q157906: Cómo: cómo mantener el estado en las páginas con
los comportamientos de persistencia basados en VBScript basado en XML corrige dolores de cabeza de la granja web por Aaron Skonnard
House
of Com: Programación en
estado
Sitios que usan los
asesinos de rendimiento y escalabilidad de la plataforma de ADN de Microsoft Windows, por George Reilly
Microsoft Visual Studio Scalabilidad Center
Fitch & Mather Stocks 2000
Ajuste de las aplicaciones FMSTOCKS
APLICACIONES Visual Basic de alto rendimiento, por Ken Spencer
Duwamish Books, Fase 4
Top DNA Rendimiento de rendimiento de rendimiento de rendimiento de errores de rendimiento y cómo prevenirlos por Gary Geiger y Jon Pulsipher
Building desde HTML estático hasta granjas web de alto rendimiento por Shawn Bice
Microsoft Microsoft Web Application Stress Tool
Nopuedo
estresarlo lo suficiente: cargue pruebe su aplicación ASP, por JD Meier
Windows ADN
Eventos de monitoreodel kit de rendimiento
en aplicaciones distribuidas utilizando Visual Studio Analyzer, por Mai-Lan Tomsen
Bibliography
Professional Active Server Pages 3.0, Wrox Press (especialmente Capítulo 26: Optimización del rendimiento de ASP, George Reilly con Matthew Gibbs).
Microsoft Internet Information Services 5.0 Guía de recursos (con el kit de recursos del servidor Windows 2000), Microsoft Press.
Microsoft Internet Information Server Kit de recursos (para IIS 4.0), Microsoft Press.
Programación de aplicaciones distribuidas con COM y Microsoft Visual Basic 6.0, por Ted Pattison, Microsoft Press.
COM, por Don Box, Keith Brown, Tim Ewald y Chris vende;
Desarrollo de usabilidad web: la práctica de la simplicidad, por Jakob Nielsen, nuevos ciclistas.
ASP Web Sitesmicrosoft
Technet para IIS
Learnasp.com
4guysfromrolla.com
15Seconds.com
asptoday.com
asp101.com
asplists.com. Muchas listas de correo profesionales incluyen:
¡código rápido!
ASP avanzó
No es una gestión de Newbiestate
Escalabilidad
Componentes de Visual Basic
XML
Edificio de componentes C ++/ATL
UseIT.com: Usabilidad web
ASP Estilo
ASP Las mejores prácticas de ASP por George Reilly
Asp Lecciones rápidas de Charles Carroll
Planning for ASP John Meade
ASP GuidelinesXML
por JD Meier
dentro de XML Performance de Chris Lovett
dentro de MSXML3 Rendimiento por Chris Lovett