webForumDet fria alternativet

Prestanda och Cache!

10 svar · 780 visningar · startad av k0ffe

k0ffeMedlem sedan maj 2003352 inlägg
#1

Hej alla!

Jag har lite funderingar kring prestanda och cache i ASP.NET, vad vinner man mest på beroende på ändamål?

De saker jag vill diskutera är främst OutPutCache vs data cache.

Låt säga att jag har en sida bestående av t.ex en gridview eller liknande kontroll dit jag kopplar en datakälla. Denna sida använder en MasterPage. Vissa delar av sidan (MasterPage) kan ej cachas då det är dynamiska kontroller med hög uppdateringsfrekvens. (Om nu hela sidan kunde cachas vore såklart det bästa att använda OutPutCache för rubbet... Men så är alltså inte fallet.)

Mina alternativ för att uppdatera innehållet i gridviewn och andra eventuella kontroller blir då vad jag kan förstå:

1. Dela upp innehållet i olika UC:s och sedan cacha varje UC var för sig med OutPutCache.
2. Cacha min datakälla till respektive kontroll.

Vilket är "bäst" ?

Någon som är insatt i detta och kan komma med åsikter kring ämnet?

GladhMedlem sedan maj 20012 812 inlägg
#2

Om det inte är besöksunikt material som presenteras, utan bara material som är samma för alla besökare, även om det uppdateras frekvent, är det sådant material, så det bästa du kan göra ur prestanda synpunkt är helt enkelt att generera en ny HTML sida vid varje uppdaterings tillfälle och presentera den istället. Men då skulle du ju lika gärna använda outputcahcen eftersom den så fall fungerar på liknande sätt.

Av de två förslag som du presenterar så är förslag ett givetviss bättre ur prestanda synpunkt eftersom IIS:en inte behöver rendera din Userkontroller vid varje hit, vilket blir fallet om du bara cachar din datakälla.

Caching gör sig alltid bäst så när presentationen som möjligt, alltås så sent som möjligt i kedjan.

- M

emissionMedlem sedan dec. 19996 721 inlägg
#3

Japp, cacha tidigt (data) och cacha sent (output). Däremellan (rendering) är optimeringvinsterna små.

Vad som ger bäst resultat beror på hur föränderlig din sida är.

GladhMedlem sedan maj 20012 812 inlägg
#4

emission skrev:

Däremellan (rendering) är optimeringvinsterna små.

Hur vet du att han bara gör rendering mellan datainsamlning och output, han kanske räknar ut alla primtal vid varje hit också!!! ;)

Även om det inte tar så mycket kraft att rendera en kontroll, så vinner man nästan alltid på att cacha outputen av kontrollen än att bara cacha datan och rendera om den vid varje ny hit. Men som emission sa det hela beror ju på hur ofta din sida ändras och hur många besökare du har. Har du massor med besökare och sidan ändras varje minut, så kan det ändå löna sig att cacha outputen, medans om du har få besökare och sidan ändras varje minut, så kommer det inte märkas överhuvudtaget om du bara cachar datan och renderar en ny sida vid varje hit.

- M

freguzMedlem sedan feb. 2005280 inlägg
#5

Jag brukar OutPut cacha mina UC vanligtvis, inte datan.

En annan bra grej som jag brukar offra lite tid på är att peta in lite trace utskrifter på strategiska ställen i c#-koden så ser man enkelt hur lång tid som går åt till de olika databasanropen osv, rekommenderas

k0ffeMedlem sedan maj 2003352 inlägg
#6

Tack för era svar!

Eftersom mitt projekt har väldigt mycket sessionsunika funktioner (som tex. edit-möjligheter på en gridview beroende på inloggad användare) så blir HTML-cache väldigt svårt. Jag tror jag försöker använda outputcache på de kontroller jag kan i olika UC:s och sedan cachar mina datakällor på de övriga platserna. Vinsten blir naturligtvis inte lika stor, men bättre än inget...

En fråga!
SqlDataSource har ju en inbyggd cache-funktion, men denna skulle jag vilja rensa utifrån andra funktioner. Kan man göra det? T.ex. om jag listar mina poster i en gridview med en SqlDataSource som cachar 1 gång / timme så vill jag ju släppa denna cache om jag från ett annat håll uppdaterar innehållet i denna gridview. Den rensas bara om jag utifrån gridviewn uppdaterar/ändrar innehållet.

k0ffeMedlem sedan maj 2003352 inlägg
#7

... En ful lösning som borde gå, är att jag för varje vy som cachas skapar unika sessionobjekt. Dessa kan jag sen tilldela olika värden när jag uppdaterar data från annat håll. Beroende på dessa värden kan jag sedan säga åt min SqlDataSource att uppdatera när jag väl står på just dennas sida.

Men nu tänker jag mest högt... :)

GladhMedlem sedan maj 20012 812 inlägg
#8

K0ffe skrev:

SqlDataSource har ju en inbyggd cache-funktion, men denna skulle jag vilja rensa utifrån andra funktioner. Kan man göra det? T.ex. om jag listar mina poster i en gridview med en SqlDataSource som cachar 1 gång / timme så vill jag ju släppa denna cache om jag från ett annat håll uppdaterar innehållet i denna gridview. Den rensas bara om jag utifrån gridviewn uppdaterar/ändrar innehållet.

Beroende på version så är SqlDataSource cachen ganska värdelöss. Om du har en SQL Server 2000, så ligger den och pollar mot databasen för att ta reda på om något har blivit ändrat i tabellen som du har satt upp din cache emot. I Sql Server 2005 så skall det vara bättre och den skall skicka tillbaka ett event till din SqlDataSource om att datan har blivit ändrad.

I ditt fall så hade jag nog inte använt mig av SqlDataSourcens cache, utan hämtat datan, och sedan cacha det data i ASP's cachen, och där satt en tidsgräns på en timme, och om du sedan ändrar innehållet från något "annat håll", (hur nu det skall gå till), så plockar du bara bort den posten från cachen och när nästa besökare behöver datan, så ser den att inget finns i cachen och måste fråga databasen efter information.

- M

k0ffeMedlem sedan maj 2003352 inlägg
#9

Ok, men jag kan inte cacha min output eftersom den vyn ska visa olika saker beroende på användarsession. Jag som en användare har mina unika redigeringsmöjligheter för de poster jag berör, samt ett annat användarkonto andra poster. Därför tror jag att cacha datan är enda möjligheten just där.

Red: Jag använder MySQL.

GladhMedlem sedan maj 20012 812 inlägg
#10

k0ffe skrev:

Ok, men jag kan inte cacha min output eftersom den vyn ska visa olika saker beroende på användarsession.

Du kan cacha din output beroende på din querystring, så om du alltid skickar med ditt sessionsid, så kommer du ju få en outputcach för varje session, frågan är ju hur mycket man tjänar på det, om man bara besöker sidan 1-2 gånger per session....

Men som jag skrev ovan så bör du cacha datan i ASP's egna cach, eller i en egen cach och sedan rendera sidan vid varje anrop utifrån datan som finns i cachen...

Angående MySQL så tror jag att den kommer att ligga och polla mot databasen för att kontrollera om något har ändrats i tabellen som du satt en cache på, om man ens kan skapa SqlDataSource cachare mot MySQL... men i vilket fall som helst så blir det meningslöst om det inte är så att databasen signalerar med ett event om när datan är ändrad och cachen är ogiltig, att ligga och polla mot databasen varje sekund, gör ingen glad...

- M

emissionMedlem sedan dec. 19996 721 inlägg
#11

Gladh skrev:

Hur vet du att han bara gör rendering mellan datainsamlning och output, han kanske räknar ut alla primtal vid varje hit också!!! ;)

Sant! Trots din smiley måste jag erkänna att jag formulerade mig lite klantigt.

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)