O ASP pode executar suas páginas dinâmicas da Web rapidamente, mas você também pode fazê-las executar mais rapidamente compactando código e conexões de banco de dados. Este é um artigo detalhado sobre como otimizar código e recursos ASP para obter a velocidade de execução mais rápida. Para um usuário impaciente, qualquer atraso entre o pressionamento de um botão do usuário e o resultado aparecer na tela pode significar que ele está navegando em outro site? Se você tiver um site comercial, isso pode significar a perda de vendas potenciais.
Não temos como controlar a largura de banda do usuário, mas obtemos o melhor desempenho otimizando o site ASP. A maioria das possíveis melhorias de desempenho ocorre por meio de alterações no sistema, em vez de restringir o código. Uma ideia inadequada é pedir ao administrador do sistema para atualizar o sistema quando você encontrar problemas de eficiência do sistema.
Primeiro, quais fatores podem afetar o desempenho do Asp? Infelizmente, existem muitos fatores? Estes são apenas alguns deles:
largura de banda disponível
A velocidade do processador e de outros hardwares no servidor
Outros programas em execução no servidor (como os protetores de tela OpenGL!)
Modo de conexão do banco de dados, pool de conexões, sistema de banco de dados em si (por exemplo, Oracle é melhor que Sql Server, Sql server é melhor que Access)
linguagem usada
Os procedimentos armazenados são melhores que as instruções SQL baseadas em linhas
Use componentes compilados em vez de VB ou JavaScript, boa experiência em programação ASP, como tratamento de erros, etc.
Alguns dos fatores acima já podem ser comumente percebidos por desenvolvedores com conhecimento e experiência em IIS, mas outros podem ser questões muito complexas para eles. Neste artigo tentaremos explicar todos os fatores que afetam o desempenho do Asp* e veremos as principais coisas que podem ser feitas nos poucos milissegundos que economizamos.
Tamanho do script ASP
A sua página de script (e outras páginas) é mais longa do que o necessário? Isso é algo que reduzirá o desempenho do Asp* assim que for executado. Os scripts ASP são úteis para obter informações e formatar a saída, mas os scripts também são interpretados linha por linha, portanto, quanto mais longo for o script, mais tempo levará para ser executado.
Se o seu script for enorme, o que você pode fazer para reduzi-lo? Aqui estão algumas sugestões:
Você pode convertê-los em componentes do lado do servidor, ou seja, em DLLs VB ou em componentes não compilados por meio de linguagens de programação avançadas do Windows ou linguagens de interface COM apropriadas? E registre-os no lado do servidor. Um guia rápido pode ser encontrado em
Encontrado em http://www.webdevelopersjournal.com/articles/activex_for_asp.html. Compilar um componente ActiveX bem escrito pode não apenas melhorar significativamente o desempenho, mas também proteger seu software (scripts), especialmente quando você publica seu site ASP em um host de terceiros.
Como os scripts são interpretados linha por linha, o desempenho pode ser melhorado eliminando scripts redundantes ou criando scripts mais eficientes. Se você tiver centenas de linhas de código em um único arquivo ASP, provavelmente dessa forma você poderá separar perfeitamente usuários, transações e serviços de dados. Na verdade, se você fizer isso, poderá encontrar algum código redundante: se precisar gerar várias tabelas, você pode escrever uma função geral para gerar uma tabela e simplesmente chamá-la várias vezes.
Ao falar sobre o tamanho dos scripts Asp, devemos mencionar o tamanho dos arquivos incluídos. Quando você usa um arquivo de inclusão, todo o arquivo de inclusão é carregado. Quando o arquivo de inclusão é incluído, é equivalente a escrever essa parte do código no próprio arquivo Asp. Portanto, se você definir muitos métodos e definições comuns em um arquivo de inclusão extenso, entenda que ao incluir o arquivo, quer você queira usar todos os métodos ou definições nele, ele será incluído no arquivo inteiro. O ASP armazena em cache todo o código de expansão, o que reduz a eficiência da pesquisa. Nesse caso, o arquivo incluído deve ser dividido em arquivos modulares menores. Entenda também que os arquivos de inclusão são tratados como solicitações de páginas separadas pelo servidor e o uso de muitos arquivos de inclusão pode afetar o tempo de download.
<!-- #include arquivo=Header.asp -->
<!-- #include arquivo=Rodapé.asp -->
<linguagem SCRIPT=vbscript runat=servidor>
Subprincipal()
WriteHeader
Escrever Corpo
Escrever rodapé
Finalizar sub
SubWriteBody()
...
Finalizar sub
Principal?'Procedimento de chamada Principal
</SCRIPT>
Se o seu script for longo, use Response.IsClientConnected. Isso significa que a CPU do seu servidor pode evitar esperar em loop quando o cliente não estiver mais conectado ao servidor.
<%
'Verifica se o cliente ainda está conectado
Se não for Response.IsClientConnected então
'Ainda conectado, manipulador
Outro
'desconectar
Terminar se
%>
Intercalando ASP e HTML
Todo mundo faz isso? Quando geramos a tabela, convertemos entre código ASP e HTML, o que é um mau hábito. Por exemplo:
<HTML>
<CORPO>
<%
Definir MyConn = Server.CreateObject(ADODB.Connection)
MdbFilePath = Server.MapPath(amostra.mdb)
MyConn.Open Driver={Driver do Microsoft Access (*.mdb)};
SQL_query = SELECT * FROM Amigos
Definir RS = MyConn.Execute(SQL_query)
ENQUANTO NÃO RS.EOF
%>
<LI><%=RS(Nome)%>: <A HREF=>Página inicial</A>
<%
RS.MoveNext
WEND
%>
</CORPO>
</HTML>
Outro exemplo comum é ao usar uma instrução IF:
<%
Se não for sessão (DBOpen) então
%>
<H1>Banco de dados não conectado</H1>
<%
Outro
%>
<H1>Banco de dados aberto</H1>
<%
Terminar se
%>
Nesses casos, o desempenho do script pode ser melhorado escrevendo o script do lado do servidor em conjunto e usando Response.write para gerar o código HTML. por exemplo:
<%
Se não for Sessão (DBOpen) Então
Response.Write <H1>Banco de dados não conectado</H1>
Outro
Response.Write <H1>Banco de dados aberto</H1>
Terminar se
%>
No caso de scripts grandes e muitos scripts, você verá melhorias de desempenho. Observe que o uso de tags <% é evitado ao máximo, para melhorar o desempenho, o ASP não precisa calcular o código Ascii dos caracteres ao executar o script.
Status da sessão
Não há dúvida de que a capacidade de manter um determinado estado através de Session é um recurso muito poderoso no ASP. No entanto, isso pode afetar seu* desempenho. Obviamente, a escalabilidade do seu site se torna outro problema se você limitar o uso de Sessões. No entanto, as sessões consomem recursos do servidor para cada usuário.
E se você não usar variáveis de sessão, ou na verdade não for necessário? Usar campos de formulário ocultos, salvar dados no banco de dados e strings de consulta é o truque? Portanto, você deve desabilitar o estado da sessão. Você pode desabilitar o uso da sessão com a seguinte instrução:
@EnableSessionState = Falso
Desta forma, o ASP não verificará mais as informações da sessão.
Se você precisar confiar no estado da sessão, evite armazenar grandes quantidades de dados no objeto de sessão. A sessão no IIS será mantida enquanto o cookie HTTP do cliente estiver disponível, fazendo com que a memória ocupada pela sessão seja ocupada até que a sessão termine ou expire. Dessa forma, se muitos usuários usarem seu programa ao mesmo tempo, os recursos do servidor poderão se esgotar.
Acesso ao banco de dados
O acesso ao banco de dados é obrigatório? Acessar um banco de dados tornará seu aplicativo drasticamente lento, mas obviamente muitos sites seriam inúteis sem um banco de dados. Mas acessando o banco de dados por meio de procedimentos armazenados em vez de usar instruções SQL incorporadas, você pode aumentar o desempenho potencial. Eles também têm boa flexibilidade* usando procedimentos armazenados e ActiveX Data Objects (ADO). Sempre que possível, produza dados de procedimentos armazenados.
Certifique-se de que seu banco de dados possua índices, pois isso melhorará diretamente a eficiência do seu programa. Além disso, tente executar Update Statistics em seu servidor de banco de dados para ajudar a rastrear sua distribuição de dados para que seu banco de dados possa modificar a execução da consulta com base nessas informações. Observe que alguns bancos de dados, como o MS Access, são realmente aceitáveis em programas de nível empresarial? SQL Sever 7.0 ou Oracle é uma aposta melhor.
Deixe o SQL funcionar como foi projetado para contar, unir, classificar e agrupar dados. Quando você puder escrever uma instrução de consulta para fazer essas coisas, não faça isso sozinho em outras linguagens.
Aqui está a sintaxe mais simples para contar todas as colunas:
SELECT contagem(*) FROM editores WHERE state='NY'
Se você contar uma coluna específica, deverá usar a instrução group by para agrupar essa coluna, caso contrário não funcionará:
SELECIONE contagem(cidade),cidade FROM editores GROUP BY cidade
Dados categorizados retornados:
SELECIONE * FROM TableName WHERE FieldName>50 OU FieldName<100 ORDER BY FieldName2, Field Name3
Usar Odbc ou arquivo DSN para conectar ao banco de dados? Use a tecnologia rápida do provedor OLEDB para conectar-se ao seu banco de dados em vez de usar uma conexão DSN. Não é mais necessário pedir ao seu ISP (ou administrador de banco de dados/administrador de rede) para configurar um DSN de sistema para você e nenhuma configuração é alterada quando você move arquivos da web.
OLEDB fica entre a camada ODBC e o aplicativo. ADO é um aplicativo baseado em ODEDB em suas páginas ASP. Suas chamadas ADO são enviadas primeiro para OLEDB e depois para a camada ODBC. No entanto, você pode se conectar diretamente à camada OLEDB e, se fizer isso, verá melhorias no desempenho do lado do servidor. Porém, como se conectar diretamente ao OLEDB?
Se você estiver usando o SQLServer 7, use o seguinte código de conexão para se conectar ao banco de dados:
strConnString = DSN='';DRIVER={SERVIDOR SQL};
UID=meuid;PWD=meupwd;
DATABASE=MeuDb;SERVIDOR=MeuServidor;
O parâmetro mais importante é a parte DRIVER=. Se quiser ignorar o ODBC e conectar-se ao SQL Server usando OLEDB (que é uma conexão mais rápida), use a seguinte sintaxe:
strConnString =Provider=SQLOLEDB.1;Password=minhasenha & _;
Persistir informações de segurança=True;ID do usuário=myuid;
Catálogo Inicial=meudbname;
Fonte de dados=meuservidor;Tempo limite de conexão=15
Há algo errado?
Agora você deve estar se perguntando: qual é o nosso objetivo nesse novo método de conexão? Por que não usar a abordagem padrão sem DSN/System DSN? Bem, de acordo com os resultados do teste de Wrox em seu livro "ADO 2.0 Programmer's Reference", se você comparar a conexão OLEDB com o método de conexão DSN ou sem DSN, encontrará as seguintes melhorias:
*Pode comparar:
Acesso SQL
OLEDBDSNOLEDBDSN
Tempo de conexão: 18?82?Tempo de conexão: 62?99
Tempo para consultar 1.000 registros: 29005400 Tempo para consultar 1.000 registros: 100950
Nota: Este resultado pode ser encontrado nas páginas 232 e 233 do livro "ADO 2.0 Programmer's Reference" do Wrox. O tempo é medido em milissegundos e o tempo de consulta para 1.000 registros é calculado usando um cursor do lado do servidor (não há muita diferença no desempenho entre conjuntos de registros OLEDB e DSN ao usar cursores do lado do cliente).
Problema de decodificação ASP:
Valide a entrada do usuário no lado do cliente sempre que possível para reduzir o número de solicitações HTTP de ida e volta. Se o seu navegador tiver suporte para JavaScript ou outros scripts, use seu poder para liberar mais recursos do servidor.
O seguinte VBScript é executado no navegador do cliente para validar as informações do usuário antes de enviá-las ao servidor:
<LINGUAGEM DO SCRIPT=VBScript>
<!--
Sub btnEnter_OnClick
DimTheForm
Definir TheForm = Document.MyForm
Se IsNumeric(TheForm.Age.Value) Então
TheForm.submit
Outro
Msgbox Por favor insira uma idade numérica.
Terminar se
Finalizar sub
//-->
</SCRIPT>
<FORMmethod=POST name=MyFormaction=myfile.asp> Nome: <INPUT typr=text name=Nome>?
Idade: <INPUT type=text name=Idade>
<Tipo de entrada=nome do botão=btnEntervalue=Enter>
</FORMULÁRIO>
Use variáveis locais e evite variáveis globais. As variáveis locais são acessadas mais rapidamente pelo mecanismo de script Asp do que as variáveis globais porque todo o domínio do nome não precisa ser pesquisado. Evite alterar as definições de array. É mais eficiente simplesmente alocar tamanho suficiente durante a primeira inicialização. Nesse caso, você pode desperdiçar um pouco de memória, mas ganha vantagem em velocidade. Esta técnica é obviamente eficaz quando o servidor está sob carga pesada.
Se você precisar fazer referência a um objeto que não é necessariamente usado, é melhor usar a tag <OBJECT> em vez de usar o método Server.CreateObject. Usar Server.CreateObject faz com que o objeto seja criado imediatamente. Pelo contrário, a tag <OBJECT> não cria o objeto imediatamente. Se você não usar o objeto após defini-lo com <object>, você não desperdiçará recursos.
Por exemplo: O exemplo a seguir usa a tag <OBJECT> para criar uma implementação de objeto Ad Rotator de roda publicitária no escopo do aplicativo.
exemplo:
<OBJETO runat=escopo do servidor=ID do aplicativo=MyAds progid=MSWC.AdRotator>
</OBJETO>
Depois de armazenar o objeto Ad Rotator no Aplicativo, você pode acessar o objeto em qualquer página do programa usando a seguinte sintaxe
<%=MyAds.GetAdvertisement(CustomerAds.txt) %>
Ative a opção 'Opção Explícita'. Em VB e VBScript, você pode usar variáveis sem declaração explícita. Mas ativar esta opção pode identificar e definir variáveis, que podem escrever bem as variáveis e ajudar a melhorar o desempenho. Variáveis locais indefinidas são mais lentas porque o namespace deve ser pesquisado para ver se a variável existe antes de criá-la. Livre-se dele e deixe cada variável claramente definida (defina primeiro, use depois).
Este é um bom hábito, pode detectar erros de digitação e é mais rápido.
A menos que você realmente precise usá-lo, não use o método Server.MapPath. Use o caminho real se você souber. O uso do MapPath exige que o IIS recupere o caminho atual do servidor, o que significa que uma solicitação especial deve ser enviada ao servidor, o que significa desempenho reduzido. Outro método é armazenar o caminho em uma variável local e usá-lo quando necessário, para que o servidor não precise procurar várias vezes.
Verifique como você está
Você pode medir o desempenho do seu sistema por meio de ferramentas como System Performance Monitor, netMon e PerfMon. Para testar o desempenho da web*, você pode usar WCAT (Ferramenta de análise de capacidade da web). Usando WCAT, você pode testar a capacidade do servidor IIS e da configuração de rede de responder a uma ampla variedade de solicitações de clientes, dados ou páginas HTML. Esses resultados de teste podem ser usados como orientação para otimizar as configurações do servidor e da rede. O WCAT foi projetado especificamente para estimar a quantidade de carga de trabalho do cliente à qual os Serviços de Internet no Windows 2000 (ou Windows NT) e no IIS podem responder.
(simulação). Para obter mais informações, consulte o Kit de recursos do IIS. Há também um extenso Guia do Usuário WCAT no site MSDN Online Web sorkshop com um link para download. Se você leva a sério seus recursos Asp*, certifique-se de obter esta ferramenta.
Esforce-se para otimizar o desempenho do aplicativo e seu aplicativo da web funcionará com mais facilidade. Não afete o desempenho do servidor se você realmente não precisar dele.
asp usa procedimentos armazenados para implementar paginação de dados
1. Crie a tabela tiku_koushi
se existir (selecione * em dbo.sysobjects onde id =
object_id(N'[dbo].[tiku_koushi]') e OBJECTPROPERTY
(id, N'IsUserTable') = 1)
eliminar tabela [dbo].[tiku_koushi]
IR
CRIAR TABELA [dbo].[tiku_koushi] (
[id] [int] IDENTIDADE (1, 1) NÃO NULO,
[título] [varchar] (250) COLLATE
Chinês_PRC_CI_AS NULO,
[list2_id] [char] (10) Agrupar
Chinês_PRC_CI_AS NULO
) EM [PRIMÁRIO]
IR
2. Procedimento armazenado sp_c
CRIAR processo sp_c
@nometabela varchar(50),
@título varchar(250),
@list2_id varchar(50)
como
if @nomedatabela='tiku_koushi'
selecione contagem(*) de tiku_koushi onde título como '%'+@title+'%' e list2_id=@list2_id
IR
3. Procedimento armazenado sp_search_tiku
CRIAR PROCEDIMENTO sp_search_tiku
@nometabela varchar(50),
@título varchar(250),
@list2_id varchar(10),
@pagesizeint,
@página int
COMO
if @nomedatabela='tiku_koushi'
começar
declare @ks int
declare @str varchar(200)
definir @ks=@pagesize*(@page-1)
se não existir (selecione * em dbo.sysobjects onde id = object_id(N'[dbo].[temp_table91]') e OBJECTPROPERTY(id, N'IsUserTable') = 1)
começar
selecione * em temp_table91 de tiku_koushi onde
título como '%'+@title+'%' e list2_id=@list2_id ordem
por id desc
definir contagem de linhas @pagesize
set @str='select * from temp_table91 onde id não está
(selecione o id principal '+str(@ks)+' de temp_table91)'
executar(@str)
eliminar tabela temp_table91
fim
fim
IR
4. search_koushi.asp
<!-- #include arquivo=conn.asp -->
<%
linha=6
se solicitação(página)=então
página=1
outro
página=solicitação(página)
terminar se
se página<1 então
página=1
terminar se
título=trim(solicitação(título))
list2_id=trim(solicitação(list2_id))
definir rs2=conn.execute(sp_c 'tiku_koushi','&title&','&list2_id&')
contagem de páginas=CInt(rs2(0)/linha)
if(CInt(rs2(0)) linha mod)=0 então
contagem de páginas = contagem de páginas
outro
contagem de páginas=contagem de páginas+1
terminar se
if CInt(página)>=contagem de páginas então
página=CInt(contagem de páginas)
terminar se
str =
str=str&page=&page&&title=&title&&list2_id=&list2_id
definir rs = conn.execute
(sp_search_tiku 'tiku_koushi','&title&','&list2_id&','&line&','&CInt(página)&')
se rs.eof então
resposta.escrever sem registro
outro
%>
<html>
<cabeça>
<tipo de estilo=texto/css>
td{tamanho da fonte:12px;}
a{decoração de texto:none;}
</estilo>
<linguagem de script=javascript>
</script>
</head>
<corpo>
<largura da tabela=518 borda=1 bordacolorlight=000000
bordercolordark=#ffffff
alinhar = centro cellpadding = 0 cellpacing = 0>
<!--DWLayoutTable-->
<tr bgcolor=#dfdfdf>
<td width=454 align=center height=24 valign=middle>Questões do exame oral</td>
<td width=63 align=center valign=middle>Excluir</td>
</tr>
<% faça até rs.eof %>
<tr altura=22>
<td valign=middle>·<a href=void(0)
onclick=window.open('editkoushi.asp?id=<%=rs(id)%>&page=<%=page%>&title=<%=title%>&list2_id=<%=list2_id%>','' ,'largura=518
altura=160 esquerda=100')>
<%=rs(título)%></a></td>
<td align=center valign=middle>Excluir</td>
</tr>
<%
rs.movnext
laço
%>
<tr alinhar=esquerda valign=meio 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 inicial</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%>>Próxima página</a> <a
href=search_koushi.asp?page=<%=pagecount%>&title=<%=title%>&list2_id=<%=list2_id%>>Última página</a>
Um total de <%=pagecount%> páginas A página atual é: <%=page%>/<%=pagecount%> páginas.
Existem <%=rs2(0)%> registros no total</td>
</tr>
</tabela>
</body>
</html>
<%
rs2.fechar
definir rs2 = nada
rs.fechar
definir rs = nada
terminar se
%>