webForumDet fria alternativet

Attribut på egenskaper och prestanda

.NET

5 svar · 377 visningar · startad av fredrik

Medlem sedan dec. 19991 072 inlägg
Frågan#1

Är det nån som känner till hur "Custom Attributes" (dvs. egna attribut) på tex. "Properties" påverkar prestandan?

Jag har en egen attribut-klass som anger hurvida vissa "properties" är uppdateringsbara eller inte.
Denna information ska jag vid ett senare tillfälle använda vid en dynamisk uppdaterings-funktion.

Vid uppdateringsläget så är inte prestandan kritisk, men den är det däremot vid ett annat visnings-läge. Och då attributen kommer att sätta på egenskaperna i båda fallen, så undrar jag nu om det innebär en stor prestandaförlust att sätta egna Attributes...

...jag förstår ju att det innebär en viss overhead, i form av instansiering av Attribut-klassen....men hur stor då, och är det nåt annat som görs?

Nån med mer erfaranhet? Tack!

Medlem sedan maj 20012 812 inlägg
#2

Du kan ju berätta mer om hur ditt visningsläge fungerar, för är det så att du har någon tidsödande funktion, typ databasanrop så lär inte dina attribute påverka prestanda speciellt mycket.

om du verkligen har extremt trimmad kod, så kanske attributet påverkar lite grand, men jag är övertygad att du har andra saker i din kod som du säkert tar mer kraft än attributeten...

- M

Medlem sedan dec. 19991 072 inlägg
#3

Det är lite svårt att förklara, men något sånt här:

Jag har egna "typklasser" med data som jag fyller ifrån en databas. Dessa läggs sedan i en klass som implementerar "IList" och "IEnumerable". En typklass kan innehålla egenskaper som "ID" och "Name" tex.

När jag binder min data till en Repeater tex. så binder jag den helt enkelt mot min egen List-klass som är fylld med mina egna typklasser.

Detta funkar ju kanon och håller även bra prestanda.

När det då gäller att uppdatera data, så skapar jag ifrån min klient en instans av en typklass som jag sedan fyller med data från olika textbox-kontroller tex.

Jag skickar sedan typklassen som en parameter till en "INSERT"-metod i min BL tex.

I denna metoden anropar jag mitt DAL där jag har skrivit en metod som dynamiskt skapar Parametrar (använder Reflection) från en typklass. Men det är ju inte alltid som alla egenskaper i en viss typklass ska användas som parametrar, och det är här mina Attributes kommer in.

Jag har nu skapat en egen Attribute-klass där jag angett att den endast får användas för Properties. I Attribute-klassen finns ett antal booleaner som anger hur denna property ska användas för parameter-logik.

Vid varje Property som jag sen skapar så sätter jag även dit ett Attribute där jag i konstruktorn skickar med hur parametrarna ska hanteras. Vilket attribut som ska användas hämtar jag med Reflection och Attributes.GetCustomAttribute().

Exempel på användning kan vara:

ID ska skickas med som parameter vid UPDATE/DELETE med inte INSERT.

Name ska skickas med som parameter vid INSERT/UPDATE med inte DELETE.

I systemet kommer jag att ha mängder med typklasser, och uppdaterings-rutiner. Då jag har byggt mina basklasser och implementationer generalla kommer jag nu tjäna massvis med kod, men jag kommer ändå att ha full kontroll på hur data bearbetas vid parameter-frågor (Administration).

Kan även tillägga att jag i min Attribute-klass skapat en flexibel lösning för att kunna hantera olika sorters special-fall.

Ja...det var väl ungefär hur det är tänkt. Allting funkar perfekt och flödet känns väl genomtänkt och fungerande.

Det enda jag alltså inte har full koll på är hur detta påverkar prestandan. Vid administrationen så använder jag somsagt Reflection, vilket jag vet är lite sämre för prestanda, men vid administrationssidor så gör det ofta inte så mycket.

Attributen jag använder för mina Egenskaper innehåller alltså bara ett antal Booleans, vilket inte borde innebära några stora prestandaförluster.

Medlem sedan maj 20012 812 inlägg
#4

Du använder väl även reflection när du fyller ditt object med data?
Du använder även reflection när du läser ut vilka attribut som dina propeties har.

Men jämfört med din databas koppling så tar inte din attributs så mycket prestanda, men visst så kostar det lite. Men samtidigt blir det som du säger en enorm vinst i utvecklingsskeddet som man inte får glömma.

Det är alltid en avvägning mellan prestanda och utvecklingstid. Visst kan man optimera prestandan, men då måste varje projekt skapas från grunden och ingen "generell kod" kan användas.

Du kan lungt köra vidare med dina attributs.

- M

Medlem sedan dec. 19991 072 inlägg
#5

Du använder väl även reflection när du fyller ditt object med data?

Görs det utan att jag "ser" det? För vad jag gör är ju helt enkelt att jag skapar en ny instans av min "typklass" och sedan skickar den till BL. Först där när det gäller hanteringen av Parametrar så antog jag att Reflection kom med i bilden.

Dim x as New TypeClass
x.Name = "F"
x.Other = "K"

Call BL.Insert(x)
Medlem sedan maj 20012 812 inlägg
#6

Jag tänkte mer på andra hållet, alltså när du hämtar data från databasen och sedan fyller ditt object med data därifrån.

I det exempel som du gav, så används inte reflection när man fyller objectet med data.

- M

270 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)