2009-02-26 20 views
5

Oggi mi è stato assegnato il compito di migliorare le prestazioni di una pagina ASP classica. Riscrivere il codice in ASP.NET in questo momento non è un'opzione, quindi ho raccolto la sfida per spremere ogni oncia di prestazioni che posso uscire dalla pagina.Suggerimenti sulle prestazioni per l'asp classico?

La pagina è costituita dal "SELECT bla bla FROM bla" di base in un paio di set di record. Un ciclo while itera su quei recordset e dump <tr> <td> stringhe. Nel ciclo del tempo c'è un sacco di condizionali e quant'altro. Esistono 3 subroutine chiamate che utilizzano variabili globali (non le variabili locali passate come parametri).

Quindi niente di veramente scioccante o altro. Prima di iniziare l'ottimizzazione, il ciclo ha richiesto circa 15 secondi. Dei 15 secondi circa 6 sono stati presi dalla query sql.

Dopo aver cambiato alcune cose sono riuscito a portarlo in giro a 7 secondi.

Le cose che ho cambiato intorno sono:

  • Invece di fare SELECT *, ho selezionato solo le colonne di cui avevo bisogno. La query è passata in media a 4 secondi. È una query piuttosto pesante con visualizzazioni all'interno di viste.

  • Ho rimosso tutto il cambio di contesto all'interno del ciclo. Così ho cambiato cose come <% = bla%> in Response.Write (bla).

  • Le 3 subroutine erano definite come funzioni, ma erano utilizzate come sub (senza risultato). Così ho cambiato le funzioni in subs. Questo aiuta?

Dopo aver apportato le mie modifiche, ho scoperto che la maggior parte del tempo era occupata da una delle subroutine. Non ho avuto abbastanza tempo oggi per modificare la subroutine, ma si compone di cose come:

  • funzioni Data: DATEADD, DATEDIFF
  • funzioni Array: UBound (arr) e indice di riferimento: arr (I)
  • funzioni stringa: a sinistra, a metà, a destra, in basso, sostituire

Con ogni chiamata pagina, che subroutine viene eseguito intorno 1600 volte.

Chiunque ha esperienza con l'ottimizzazione delle pagine asp classiche? Hai qualche buon consiglio per l'ottimizzazione? Quello che sto cercando è il miglioramento del codice all'interno di un do ... ciclo statement.

Sono uno sviluppatore esperto di ASP.NET e conosco piuttosto il miglioramento della perfomance in ASP.NET. L'ASP classico usa un "motore" diverso, quindi mi chiedevo se qualcuno là fuori avesse qualche idea su come migliorare le prestazioni del classico ASP.

Grazie!

M

PS: Sì, lo so che il classico ASP utilizza VBScript

risposta

3

Con ogni chiamata pagina, che subroutine viene eseguito intorno 1600 volte.

direi che è praticamente tutto il problema, ma senza conoscere i dettagli dei dati restituiti la query, cosa che subroutine fa, e perché che deve essere fatto 1600 volte per una pagina, è difficile suggerire molto per abbassarlo.

+0

È per un'applicazione di pianificazione e la persona che l'ha creata ha creato con entusiasmo un grande ciclo di tempo che mostra la pianificazione di molti record per un intero mese (30 colonne e circa 20 righe). – mghaoui

0

Se pensi davvero che il problema sia in quella funzione 1, perché non inserisci qui il codice in modo che le persone possano fare suggerimenti di ottimizzazione.

+0

Purtroppo non possiedo il codice. Probabilmente mi metterò nei guai per averlo pubblicato. Fondamentalmente, la funzione crea stringhe basate sul recordset, ma esegue lo splicing e il conctenating e quindi lo scarica con response.write. Roba standard. – mghaoui

+0

Purtroppo anche, è difficile dare suggerimenti quando si stanno facendo cose standard e non abbiamo accesso al codice. :) Proprio come ha detto Chad, forse puoi pensare di più al "perché". O forse puoi provare a spostare un gruppo di operazioni su una stored procedure. –

+0

Mi chiedo se sia il concatenare a causare il problema. VB è noto per non gestire bene concat 'di stringhe ... Cerca in un metodo alternativo di scrivere sullo schermo o creare stringhe lunghe (si pensi array o oggetto stream). –

-2

Ho sperimentato che nella maggior parte dei casi è possibile ottenere prestazioni quando si utilizza un oggetto StringBuilder in ASP classico. C'è un bel StringBuilder implementation per ASP classico all'interno dello ajaxed library. Usa il .net StringBuilder. Quello è piuttosto fresco e facile da usare:

<% 
set output = new StringBuilder 
do 
    output("some output") 
loop 
response.write(output.toString()) 
%> 

mi consiglia di utilizzare biblioteca ajaxed se avete bisogno di fare qualche ritocco. È configurato rapidamente e offre molti strumenti per ASP classico. Per esempio. Forse potresti anche ottenere delle prestazioni quando usi AJAX (o almeno l'impressione di prestazioni).

3

Sto segnando la risposta di MrChrister come la risposta alla mia domanda "Hai qualche buon consiglio per l'ottimizzazione?". I suggerimenti ci sono buoni e sono riusciti a velocizzare lo script di 2 secondi.

Ho scoperto alla fine cosa stava facendo la sceneggiatura lentamente. Nel ciclo while il programmatore stava facendo un filtro (array) molto. Fondamentalmente stava usando Filter (Array) per cercare coppie chiave/valore.

Quindi la soluzione finale stava cambiando il codice di Filtro (matrice) per utilizzare l'oggetto "Scripting.Dictionary". Ha accelerato il codice di un fattore di 12.

Grazie per tutte le vostre risposte.

M

3

Visto che questa è una domanda popolare che ho deciso di spiegare quello che ho fatto 3 anni fa, che ha accelerato lo script ASP.

Lo script originale ha fatto un uso massiccio di array ridimensionabili per archiviare valori-chiave, quindi ho modificato tale codice per utilizzare Scriting.Dictionary. Esempio:

Dim myDictionary 
Set myDictionary = Createobject("Scripting.Dictionary") 
myDictionary.item("key") = "value" 

Questo è molto più veloce di array ridimensionabili.

Un altro grande cambiamento è la concatenazione di stringhe. La sceneggiatura originale era pieno di:

S = "" 
S = S & "First line<br />" 
S = S & "Second line<br />" 
S = S & "Third line line<br />" 
Response.Write(S) 

ho modificato questo per:

Response.Write("First line<br />") 
Response.Write("Second line<br />") 
Response.Write("Third line<br />") 

questo ha fatto una differenza enorme. La concatenazione di stringhe è un enorme collo di bottiglia perché la stringa viene gettata via e quindi reinizializzata.

Un'altra opzione è:

S = "First line<br />" & _ 
     "Second line<br />" & _ 
     "Third line line<br />" 
Response.Write(S) 

Questo è anche un buon consiglio per ASP.NET: Utilizzare uno StringBuilder invece di concatenazione di stringhe.

Un altro cambiamento importante è il cambio di contesto. Il codice originale era pieno di:

<table> 
    <tr> 
     <td><%= rs("Col1") %></td> 
     <td><%= rs("Col2") %></td> 
     <td><%= rs("Col2") %></td> 
    </tr> 
</table> 

Il 3 di contesto prende un sacco di tempo in modo ho modificato a questo:

<% 
Response.Write("<table>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col1")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col2")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col3")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("</table>") 
%> 

Sì, il codice è molto ridondante, ma si comporta meglio.

Un'altra piccola modifica (che in realtà è un hack sporco) è da usare con (NOLOCK) nelle query SQL:

conn.Query("SELECT * FROM MyTable WITH (NOLOCK) LEFT JOIN AnotherTable WITH (NOLOCK) ON MyTable.Id = AnotherTable.Id") 

Si fa la differenza.

Infine, non so se questo aiuti molto, ma c'era un sacco di codice incollato sulla copia che ho rifatto in funzioni pulite.

Spero che le persone che trovano questo thead troveranno questi suggerimenti utili.

+0

Il mio commento è stato downvoted a 0? Veramente? La persona che ha downvoted ha effettivamente letto il thread? – mghaoui

Problemi correlati