Tänkte se om någon här vill bolla lite idéer angående optimering av sina applikationer. Cahhning är bra. Använd det. .NET håller reda på cachen och om den blir för stor rensar den själv bort så att servern inte får problem. Åtminstone är det tänkt att det är så det fungerar. Utgå från det, eventuellt stresstesta med massor i cachen. Application Center Test i Visual Studio kan vara till hjälp.. Ja, vissa sidor cachar jag som hela sidor.Optimera för prestanda
I helgen har jag suttit och funderat en hel del på hur jag på bästa sätt skall förbättra prestandan på mina applikationer. Något som är viktigt är självklart att utnyttja cache på bästa sätt.
Men vad är då bästa sätt?
Jag bygger alltid mina applikationer objektorienterade. Jag har klasser och starkt typade collections. Det jag nu funderar på är hur jag får ut bästa prestandan när jag använder cachen.
1. Eftersom jag har collections känns det rätt naturligt att cacha en collection. Ex. Varje sida i en sajt är uppbyggd av en template, varje template har textelement, varje sida är kopplad till en template samt text för textelementen. Då skulle jag alltså cacha en collection med all text.
Fördel
- Väldigt enkelt att plocka ut all text för en sida
Nackdel
- Kan bli stora objekt när sajten växer. Eller om man istället för sidorna har produktdatabasen så kan det också bli stort.
- I ovanstående fall blir det en collection för varje språk. På en sajt har jag 27 länder, vissa med flera språk = många collections i cachen om flera av språkversionerna används flitigt.
- Måste bygga in funktionalitet för att uppdatera eller slänga cachen så fort något av innehållet ändras i databasen. Kan dock göra cachen file-dependent genom att ändra en textfil varje gång databasen ändras.
2. Funderade på hur man kan använda XML som ett mellansteg. Dels om det är snabbare att ladda in och söka igenom en XML-fil istället för databasen, eller cacha innehållet i XML-filen och på så sätt ha en file-dependent cache.
Fördel
- Om databasen är nere finns innehållet fortfarande tillgängligt i XML-filerna
- Cachen är file-dependent så jag behöver inte tänka på att uppdatera cachen när jag ändrar innehållet i databasen.
- Inga onödiga db-anrop
Nackdel
- Har då två stycken datakällor så egentligen skulle man kunna skippa databasen.
- Ingen objekt-orientering längre om jag inte använder cachen för att fylla objekt och collections.
- Hur filterar man XML-innehållet?
- Måste bygga in funktionalitet för att byta ut XML-filerna varje gång jag ändrar i databsen.
Båda idéerna har även nackdelen att man cachar allt istället för att få minsta möjliga dataresultat från databasen.
Det jag dras mest mot är självklart alternativ 1 där jag cachar mina collections. Men finns det något sätt att mäta hur stora dessa collections blir?
Ja, som sagt, mycket att tänka på. Det finns många knep att förbättra prestandan men gör man fel kan det bli en riktig flaskhals istället.
Några funderingar? Hur löser ni prestandaproblem?
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Optimera för prestanda
Cacha collections säger du. Jag är lite tveksam till det. Är det read-only data som används vid visning?
Då är det ju lite onödigt att från denna collection rendera HTML vid varje anrop. Cacha HTML-koden rakt av i stället. För detta kanske du vill använda en UserControl som du cachar upp.
Jag har mest använt cache ihop med Dataset. Där man har vissa tabeller som inte är så extremt stora, som man vill filtrera, och som inte uppdateras ens dagligen. Då fungerar Dataset mycket bra, det lagras i cachen. Om det inte finns hämtas det från databasen och läggs i cachen. Datat binder till en servercontrol. Det är fexibelt, lätt att ändra och lägga till i en sådan lösning. Och vad jag har sett mycket snabbt.. (inte så hög belastning dock i det här fallet).
Var inte rädd att slå upp saker i databaser.
Det är ju betydligt bättre det än att söka i XML-filer. Betydligt snabbare! (SqlClient).
OlaSv: Optimera för prestanda
Det finns dock nackdelar med det också. Om jag cachar alla sidor så måste jag göra det med en version för varje språk. Jag måste även hålla reda på och lägga in funktioner som rensar cachen när jag ändrar någon text i databasen så att inte gammal text ligger cachad för nåt språk på någon sida.
Jag ska göra lite tester. Fördelen med att inte cacha ALL information är ju att när man hämtar ur databasen så hämtar man en specifik fråga. Detta gör att när man sätter ihop en collection så blir det en liten collection istället för en stor komplett som cachas.
Det första jag ska göra för att öka prestandan är i alla fall att ta bort alla DataViews. Det är väldigt prestandakrävande att använda en DV att sortera och filtera har jag märkt. Och eftersom jag nu gått över och använder objekt och collections så finns sorteringen och filtreringen där.
Det gäller att hålla tungan rätt i munnen.
Läste i alla fall en väldigt bra bok i helgen som jag kan rekommendera. "Real World ASP.NET Best Practices" av Farhan Muhammed och Matt Milner. Lättläst och kort men guld värd. Bara kapitlen om Cache och Datahantering gör boken värd att läsa.
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nu