ASP puede ejecutar sus páginas web dinámicas rápidamente, pero también puede hacer que se ejecuten más rápido comprimiendo código y conexiones de bases de datos. Este es un artículo detallado sobre cómo optimizar el código y las funciones ASP para obtener la velocidad de ejecución más rápida. Para un usuario impaciente, ¿cualquier retraso entre presionar un botón de usuario y que el resultado aparezca en su pantalla podría significar que está navegando por otro sitio? Si tienes un sitio comercial, esto podría significar perder ventas potenciales.
No tenemos ninguna forma de controlar el ancho de banda del usuario, pero obtenemos el mejor rendimiento optimizando el sitio ASP. La mayoría de las posibles mejoras de rendimiento se obtienen a través de cambios en el sistema en lugar de ajustar el código. Una idea inapropiada es pedirle al administrador del sistema que actualice el sistema una vez que encuentre problemas de eficiencia.
Primero, ¿qué factores podrían afectar el desempeño de Asp? Desafortunadamente, ¿hay muchos factores? Estos son sólo algunos de ellos:
ancho de banda disponible
La velocidad del procesador y otro hardware en el servidor.
Otros programas que se ejecutan en el servidor (¡como esos protectores de pantalla OpenGL!)
Modo de conexión de la base de datos, grupo de conexiones, sistema de base de datos en sí (por ejemplo, Oracle es mejor que Sql Server, Sql Server es mejor que Access)
idioma usado
Los procedimientos almacenados son mejores que las declaraciones SQL basadas en filas
Utilice componentes compilados en lugar de VB o JavaScript, buena experiencia en programación ASP, como manejo de errores, etc.
Es posible que los desarrolladores con conocimiento y experiencia en IIS ya noten algunos de los factores anteriores, pero otros pueden ser cuestiones muy complejas para ellos. En este artículo intentaremos explicar todos los factores que afectan el rendimiento de Asp* y veamos las principales cosas que se pueden hacer en los pocos milisegundos que afeitamos.
Tamaño de secuencia de comandos ASP
¿La página de su guión (y otras páginas) es más larga de lo necesario? Esto es algo que reducirá el rendimiento de Asp* tan pronto como se ejecute. Los scripts ASP son útiles para obtener información y formatear la salida, pero los scripts también se interpretan línea por línea, por lo que cuanto más largo sea el script, más tiempo tardará en ejecutarse.
Si tu guión es enorme, ¿qué puedes hacer para reducir su extensión? Aquí hay algunas sugerencias:
¿Puede convertirlos en componentes del lado del servidor, es decir, en archivos DLL de VB o en componentes no compilados mediante lenguajes de programación avanzados de Windows o lenguajes de interfaz COM apropiados? Y regístrelos en el lado del servidor. Puede encontrar una guía rápida en
Encontrado en http://www.webdevelopersjournal.com/articles/activex_for_asp.html. Compilar un componente ActiveX bien escrito no sólo puede mejorar enormemente el rendimiento, sino también proteger su software (scripts), especialmente cuando publica su sitio ASP en un host de terceros.
Dado que los scripts se interpretan línea por línea, el rendimiento se puede mejorar eliminando scripts redundantes o creando scripts más eficientes. Si tiene cientos de líneas de código en un solo archivo ASP, probablemente de esta manera pueda separar bien los usuarios, las transacciones y los servicios de datos. De hecho, si hace esto, puede encontrar código redundante: si necesita generar varias tablas, puede escribir una función general para generar una tabla y simplemente llamarla varias veces.
Cuando hablamos del tamaño de los scripts Asp, debemos mencionar el tamaño de los archivos incluidos. Cuando utiliza un archivo de inclusión, se carga todo el archivo de inclusión. Cuando se incluye el archivo de inclusión, equivale a escribir esa parte del código en el propio archivo Asp. Por lo tanto, si define muchos métodos y definiciones comunes en un archivo de inclusión extenso, comprenda que cuando incluya el archivo, ya sea que desee utilizar todos los métodos o definiciones que contiene, se incluirá en todo el archivo cargado. ASP almacena en caché todo el código de expansión, lo que reduce la eficiencia de la búsqueda. En este caso, el archivo incluido debe dividirse en archivos modulares más pequeños. También comprenda que el servidor trata los archivos de inclusión como solicitudes de páginas separadas, y el uso de demasiados archivos de inclusión puede afectar los tiempos de descarga.
<!-- #include file=Encabezado.asp -->
<!-- #include file=Pie de página.asp -->
<lenguaje SCRIPT=vbscript runat=servidor>
Subprincipal()
Escribir encabezado
escribircuerpo
Escribir pie de página
Subtítulo final
SubWriteBody()
...
Subtítulo final
¿Principal?'Procedimiento de llamada Principal
</guión>
Si su secuencia de comandos es larga, utilice Response.IsClientConnected. Esto significa que la CPU de su servidor puede evitar esperar en un bucle cuando el cliente ya no está conectado al servidor.
<%
'Comprueba si el cliente todavía está conectado
Si no es Response.IsClientConnected entonces
'Todavía conectado, controlador
Demás
'desconectar
Terminar si
%>
Intercalando ASP y HTML
¿Todos hacen esto? Cuando generamos la tabla, convertimos entre código ASP y HTML, lo cual es un mal hábito. Por ejemplo:
<HTML>
<CUERPO>
<%
Establecer MyConn = Server.CreateObject(ADODB.Connection)
MdbFilePath = Server.MapPath(muestra.mdb)
MyConn.Open Driver={Controlador de Microsoft Access (*.mdb)}; DBQ= & MdbFilePath & ;
SQL_query = SELECCIONAR * DE Amigos
Establecer RS = MyConn.Execute(SQL_query)
MIENTRAS NO RS.EOF
%>
<LI><%=RS(Nombre)%>: <A HREF=>Página de inicio</A>
<%
RS.MoverSiguiente
ENCAMINARSE A
%>
</CUERPO>
</HTML>
Otro ejemplo común es cuando se utiliza una declaración IF:
<%
Si no es sesión (DBOpen) entonces
%>
<H1>Base de datos no conectada</H1>
<%
Demás
%>
<H1>Base de datos abierta</H1>
<%
Terminar si
%>
En estos casos, el rendimiento del script se puede mejorar escribiendo el script del lado del servidor en conjunto y usando Response.write para generar el código HTML. Por ejemplo:
<%
Si no es sesión (DBOpen) entonces
Respuesta.Escribir <H1>Base de datos no conectada</H1>
Demás
Respuesta.Escribir <H1>Base de datos abierta</H1>
Terminar si
%>
En el caso de scripts grandes y muchos scripts, verá mejoras en el rendimiento. Tenga en cuenta que se evita en la medida de lo posible el uso de etiquetas <%, para mejorar el rendimiento. ASP no necesita calcular el código Ascii de caracteres al ejecutar el script.
Estado de la sesión
No hay duda de que la capacidad de mantener un determinado estado a través de la sesión es una característica muy poderosa en ASP. Sin embargo, puede afectar su* rendimiento. Obviamente, la escalabilidad de tu sitio se convierte en otro problema si limitas el uso de Sessions. Sin embargo, las sesiones consumen recursos del servidor para cada usuario.
¿Qué pasa si no usas variables de sesión, o de hecho no es necesario? ¿Usar campos de formulario ocultos, guardar datos en la base de datos y cadenas de consulta es el truco? Entonces deberías deshabilitar el estado de sesión. Puede desactivar el uso de la sesión con la siguiente declaración:
@EnableSessionState = Falso
De esta forma, ASP ya no comprobará la información de la sesión.
Si tiene que confiar en el estado de la sesión, debe evitar almacenar grandes cantidades de datos en el objeto de la sesión. La sesión en IIS se mantendrá mientras la cookie HTTP del cliente esté disponible, provocando que la memoria ocupada por la sesión esté ocupada hasta que la sesión finalice o expire. De esta forma, si muchos usuarios utilizan tu programa al mismo tiempo, los recursos de tu servidor pueden agotarse.
Acceso a la base de datos
¿El acceso a la base de datos es imprescindible? Acceder a una base de datos ralentizará drásticamente su aplicación, pero obviamente muchos sitios no tendrían valor sin una base de datos. Pero al acceder a la base de datos a través de procedimientos almacenados en lugar de utilizar sentencias SQL incorporadas, puede aumentar el rendimiento potencial. También tienen buena flexibilidad* mediante el uso de procedimientos almacenados y objetos de datos ActiveX (ADO). Siempre que sea posible, genere datos de procedimientos almacenados.
Asegúrese de que su base de datos tenga índices, ya que esto mejorará directamente la eficiencia de su programa. Además, intente ejecutar Actualizar estadísticas en su servidor de base de datos para ayudar a rastrear su distribución de datos para que su base de datos pueda modificar la ejecución de consultas en función de esta información. Tenga en cuenta que algunas bases de datos, como MS Access, son realmente aceptables en programas de nivel empresarial. SQL Sever 7.0 u Oracle es una mejor apuesta.
Deje que SQL funcione tal como fue diseñado para contar, unir, ordenar y agrupar datos. Cuando pueda escribir una declaración de consulta para hacer estas cosas, no lo haga usted mismo en otros idiomas.
Aquí está la sintaxis más simple para contar todas las columnas:
SELECCIONE el recuento (*) DE los editores DONDE estado = 'NY'
Si cuenta una columna específica, debe usar la instrucción group by para agrupar esa columna; de lo contrario, no funcionará:
SELECCIONE recuento (ciudad), ciudad DEL GRUPO DE editores POR ciudad
Datos categorizados devueltos:
SELECCIONE * DESDE Nombre de tabla DONDE Nombre de campo>50 O Nombre de campo<100 ORDENAR POR Nombre de campo2, Nombre de campo3
¿Usar Odbc o archivo DSN para conectarse a la base de datos? Utilice la tecnología rápida del proveedor OLEDB para conectarse a su base de datos en lugar de utilizar una conexión DSN. Ya no tendrá que pedirle a su ISP (o administrador de base de datos/administrador de red) que configure un DSN del sistema, ni cambios de configuración cuando mueva archivos web.
OLEDB se encuentra entre la capa ODBC y la aplicación. ADO es una aplicación además de ODEDB en sus páginas ASP. Sus llamadas ADO se envían primero a OLEDB y luego a la capa ODBC. Sin embargo, puede conectarse directamente a la capa OLEDB y, si lo hace, verá mejoras en el rendimiento del lado del servidor. Sin embargo, ¿cómo conectarse directamente a OLEDB?
Si está utilizando SQLServer 7, utilice el siguiente código de conexión para conectarse a la base de datos:
strConnString = DSN='';CONDUCTOR={SERVIDOR SQL};
UID=myuid;PWD=mypwd;
BASE DE DATOS=MiBD;SERVIDOR=MiServidor;
El parámetro más importante es la parte DRIVER=. Si desea omitir ODBC y conectarse a SQL Server mediante OLEDB (que es una conexión más rápida), utilice la siguiente sintaxis:
strConnString =Proveedor=SQLOLEDB.1;Contraseña=micontraseña & _;
Persistir información de seguridad = Verdadero; ID de usuario = myuid;
Catálogo inicial=mydbname;
Fuente de datos=miservidor;Tiempo de espera de conexión=15
¿Hay algo mal?
Ahora quizás te preguntes: ¿cuál es el objetivo de este nuevo método de conexión? ¿Por qué no utilizar el enfoque estándar sin DSN/DSN del sistema? Bueno, según los resultados de las pruebas de Wrox en su libro "Referencia del programador ADO 2.0", si compara la conexión OLEDB con el método de conexión DSN o sin DSN, encontrará las siguientes mejoras:
*Se puede comparar:
Acceso SQL
OLEDBDSNOLEDBDSN
Tiempo de conexión: 18?82?Tiempo de conexión: 62?99
Tiempo para consultar 1000 registros: 29005400 Tiempo para consultar 1000 registros: 100950
Nota: Este resultado se puede encontrar en las páginas 232 y 233 del libro "ADO 2.0 Programmer's Reference" de Wrox. El tiempo se mide en milisegundos y el tiempo de consulta de 1000 registros se calcula utilizando un cursor del lado del servidor (no hay mucha diferencia en el rendimiento entre los conjuntos de registros OLEDB y DSN cuando se utilizan cursores del lado del cliente).
Problema de decodificación ASP:
Valide la entrada del usuario en el lado del cliente siempre que sea posible para reducir la cantidad de solicitudes HTTP de ida y vuelta. Si su navegador tiene la capacidad de admitir JavaScript u otros scripts, utilice su potencia para liberar más recursos del servidor.
El siguiente VBScript se ejecuta en el navegador del cliente para validar la información del usuario antes de enviarla a su servidor:
<IDIOMA DE ESCRITURA=VBScript>
<!--
Sub btnEnter_OnClick
DimTheForm
Establecer TheForm = Documento.MyForm
Si es numérico (TheForm.Age.Value) entonces
El formulario.enviar
Demás
Msgbox Por favor ingrese una edad numérica.
terminar si
Subtítulo final
//-->
</guión>
<FORMmethod=POST nombre=MiFormaccion=miarchivo.asp> Nombre: <INPUT typr=nombre de texto=Nombre>?
Edad: <Tipo de ENTRADA=nombre de texto=Edad>
<Tipo de ENTRADA=nombre del botón=btnIntroducir valor=Entrar>
</FORMULARIO>
Utilice variables locales y evite las variables globales. El motor de secuencias de comandos Asp accede a las variables locales más rápido que a las variables globales porque no es necesario buscar en todo el dominio de nombres. Evite cambiar las definiciones de matrices. Es más eficaz simplemente asignar un tamaño suficiente durante la primera inicialización. En este caso, puede que desperdicies algo de memoria, pero obtienes la ventaja de la velocidad. Esta técnica es obviamente efectiva cuando el servidor está bajo una gran carga.
Si necesita hacer referencia a un objeto que no necesariamente se usa, es mejor usar la etiqueta <OBJECT> en lugar de usar el método Server.CreateObject. El uso de Server.CreateObject hace que el objeto se cree inmediatamente. Por el contrario, la etiqueta <OBJECT> no crea el objeto inmediatamente. Si no utiliza el objeto después de definirlo con <object>, no desperdiciará recursos.
Por ejemplo: el siguiente ejemplo utiliza la etiqueta <OBJECT> para crear una implementación de objeto Ad Rotator de rueda publicitaria de alcance de aplicación.
ejemplo:
<OBJECT runat=alcance del servidor=ID de aplicación=MyAds progid=MSWC.AdRotator>
</OBJETO>
Después de almacenar el objeto Ad Rotator en la aplicación, puede acceder al objeto en cualquier página del programa utilizando la siguiente sintaxis
<%=Mis anuncios.GetAdvertisement(CustomerAds.txt) %>
Active el interruptor 'Opción explícita'. En VB y VBScript, puede utilizar variables sin declaración explícita. Pero activar esta opción puede identificar y definir variables, lo que puede escribir bien las variables y ayudar a mejorar el rendimiento. Las variables locales no definidas son más lentas porque se debe buscar en el espacio de nombres para ver si la variable existe antes de crearla. Deshágase de él y defina claramente cada variable (defina primero, use después).
Este es un buen hábito, puede detectar errores tipográficos y es más rápido.
A menos que realmente necesite usarlo, no use el método Server.MapPath. Utilice el camino real si lo conoce. El uso de MapPath requiere que IIS recupere la ruta actual del servidor, lo que significa que se debe enviar una solicitud especial al servidor, lo que significa un rendimiento reducido. Otro método es almacenar la ruta en una variable local y usarla cuando sea necesario, de modo que el servidor no necesite buscarla varias veces.
Comprueba cómo estás
Puede medir el rendimiento de su sistema a través de herramientas como System Performance Monitor, netMon y PerfMon. Para probar el rendimiento web*, puede utilizar WCAT (Herramienta de análisis de capacidad web). Con WCAT, puede probar la capacidad de su servidor IIS y la configuración de red para responder a una amplia variedad de solicitudes de clientes, datos o páginas HTML. Los resultados de estas pruebas se pueden utilizar como guía para optimizar las configuraciones de su servidor y de red. WCAT está diseñado específicamente para estimar la cantidad de carga de trabajo del cliente a la que pueden responder los servicios de Internet en Windows 2000 (o Windows NT) e IIS.
(simulación). Para obtener más información, consulte el kit de recursos de IIS. También hay una extensa Guía del usuario de WCAT en el sitio web de MSDN Online Sorkshop con un enlace de descarga. Si se toma en serio las capacidades de Asp*, asegúrese de obtener esta herramienta.
Esfuércese por optimizar el rendimiento de la aplicación y su aplicación web se ejecutará sin problemas. No afecte el rendimiento del servidor si realmente no lo necesita.
asp utiliza procedimientos almacenados para implementar la paginación de datos
1. Crea la tabla tiku_koushi
si existe (seleccione * de dbo.sysobjects donde id =
object_id(N'[dbo].[tiku_koushi]') y OBJECTPROPERTY
(identificación, N'IsUserTable') = 1)
soltar tabla [dbo].[tiku_koushi]
IR
CREAR TABLA [dbo].[tiku_koushi] (
[id] [int] IDENTIDAD (1, 1) NO NULA,
[título] [varchar] (250) COLABORAR
Chino_PRC_CI_AS NULL,
[list2_id] [char] (10) COLABORAR
Chino_PRC_CI_AS NULL
) EN [PRIMARIO]
IR
2. Procedimiento almacenado sp_c
CREAR proceso sp_c
@nombretabla varchar(50),
@título varchar(250),
@list2_idvarchar(50)
como
si @tablename='tiku_koushi'
seleccione recuento (*) de tiku_koushi donde título como '%'+@title+'%' y list2_id=@list2_id
IR
3. Procedimiento almacenado sp_search_tiku
CREAR PROCEDIMIENTO sp_search_tiku
@nombretabla varchar(50),
@título varchar(250),
@list2_id varchar(10),
@pagesize int,
@páginaint
COMO
si @tablename='tiku_koushi'
comenzar
declarar @ks int
declarar @str varchar(200)
establecer @ks=@tamaño de página*(@página-1)
si no existe (seleccione * de dbo.sysobjects donde id = object_id(N'[dbo].[temp_table91]') y OBJECTPROPERTY(id, N'IsUserTable') = 1)
comenzar
seleccione * en temp_table91 de tiku_koushi donde
título como '%'+@title+'%' y list2_id=@list2_id orden
por id desc
establecer el recuento de filas @pagesize
establezca @str='select * de temp_table91 donde la identificación no está
(seleccione la identificación superior '+str(@ks)+' de temp_table91)'
ejecutar(@str)
soltar tabla temp_table91
fin
fin
IR
4. buscar_koushi.asp
<!-- #include file=conn.asp -->
<%
línea=6
si solicitud (página) = entonces
página=1
demás
página=solicitud(página)
terminar si
si página <1 entonces
página=1
terminar si
título=recortar(solicitud(título))
list2_id=recortar(solicitud(list2_id))
establecer rs2=conn.execute(sp_c 'tiku_koushi','&title&','&list2_id&')
recuento de páginas=CInt(rs2(0)/línea)
si (CInt (rs2 (0)) línea mod) = 0 entonces
recuento de páginas = recuento de páginas
demás
recuento de páginas=recuento de páginas+1
terminar si
si CInt(página)>=recuento de páginas entonces
página=CInt(recuento de páginas)
terminar si
cadena =
str=str&page=&página&&title=&título&&list2_id=&list2_id
establecer rs=conn.ejecutar
(sp_search_tiku 'tiku_koushi','&title&','&list2_id&','&line&','&CInt(página)&')
si rs.eof entonces
respuesta.escribir sin registro
demás
%>
<html>
<cabeza>
<tipo de estilo=texto/css>
td{tamaño de fuente:12px;}
a{texto-decoración:ninguno;}
</estilo>
<lenguaje de escritura=javascript>
</script>
</cabeza>
<cuerpo>
<ancho de tabla=518 borde=1 bordecolorluz=000000
bordecoloroscuro=#ffffff
align=center cellpadding=0 cellspace=0>
<!--DWLayoutTable-->
<trbgcolor=#dfdfdf>
<td width=454 align=center height=24 valign=middle>Preguntas del examen oral</td>
<td width=63 align=center valign=middle>Eliminar</td>
</tr>
<% hacerlo hasta rs.eof %>
<tr altura=22>
<td valign=medio>·<a href=void(0)
onclick=window.open('editkoushi.asp?id=<%=rs(id)%>&page=<%=page%>&title=<%=title%>&list2_id=<%=list2_id%>','' ,'ancho=518
altura=160 izquierda=100')>
<%=rs(título)%></a></td>
<td align=center valign=middle>Eliminar</td>
</tr>
<%
rs.movenext
bucle
%>
<tr align=valign izquierdo=medio bgcolor=efeff6
altura = 22>
<td colspan=2 estilo=padding-left:6px;>
<a href=search_koushi.asp?page=<%=1%>&title=<%=title%>&list2_id=<%=list2_id%>>Página de inicio</a> <a
href=search_koushi.asp?page=<%=page-1%>&title=<%=title%>&list2_id=<%=list2_id%>>Página anterior</a> <a
href=search_koushi.asp?page=<%=page+1%>&title=<%=title%>&list2_id=<%=list2_id%>>Página siguiente</a> <a
href=search_koushi.asp?page=<%=pagecount%>&title=<%=title%>&list2_id=<%=list2_id%>>Última página</a>
Un total de <%=pagecount%> páginas. La página actual es: <%=page%>/<%=pagecount%> páginas.
Hay <%=rs2(0)%> registros en total</td>
</tr>
</tabla>
</cuerpo>
</html>
<%
rs2.cerrar
establecer rs2 = nada
rs.cerrar
establecer rs = nada
terminar si
%>