Jó napot, jó kódolást!
A minap eszembe jutott, hogy túl sokat kerülgettem már a .NET fókaságait, így a mai topic eköré fog épülni.
Először is, elővenném kedvenc területemet, a Reflection namespace-t, amit oly sokan szidtak már az idők során a lassúsága miatt. Azok, akik hisznek a pici és puha óriás erejében, ajánlok egy oldalt tőlük, ahol megideologizálják kifejtik, hogy mikor érdemes és hogyan Reflection-t használni, hogy az gyors is legyen. Az illúzió konzerválása érdekében akkor itt abba is hagynám a helyükben az olvasást, és folytatnám a Windows 8-at népszerűsítő oldalak valamelyikével, például.
Azoknak, akik nem portugál őslakosnak születtek, akik bedőlnek a csillogó tükör ámításának, álljon itt elrettentő példaként egy kedvencem.
Ősi mantra kezdő reflektáláshoz
Mit kell tennünk, ha valami okból (pl. adatelérési rétest sütünk) elkerülhetetlenül Reflection-nel kell dolgoznunk?
Cachelni, cachelni, CACHELNI. Azért, mert egyrészt minden, egy típusról kideríthető információt nem szeretnénk újra és újra kiszámoltatni, másrészt mert esetleg építenénk köré különféle segítő classokat, stb.
Ha úgy gondoljuk, hogy ilyen mélyen belemászni a lecsóba merő időpazarlás, annak az embernek a meglepettségével fogunk szembenézni amikor ránk szakad mondjuk kétmillió hívás egy ilyen területen, aki éppen most ébredt kómásan egy sötét pincében, szájában gag-ball, kezei lánccal egy oszlophoz kötve, és két bájos, kopasz, vetkőző uriember közelít feléje.
FullName, avagy a legtriviálisabb veszteség
Azt hinné az ember, hogy ha egy fajt elneveznek, azt nagy biztonsággal lehet konstansnak venni. Mert hát ugye az se nagyon változik, hogy ki milyen nemű. Na, ez a .NET szerint nem hogy változhat, hanem rendre a Type.FullName property ki is számolja, valahányszor azt lekérdezzük. Az nem számít, hogy normális kód ugye nem változik menet közben, ergo a namespace-ek se vándorolnak délnek ha melegebb van. Az se számít, hogy az első használatnál - egye fene - legyen csak kiszámolva valami, ami kvázi-konstans, azt' egy mezőből majd előrántjuk, ha legközelebb kell, neeem.
Vessünk egy pillantást az alábbi ábrára.
Igen, 9,6 másodperc színtiszta pazarlás, dobozolva.
"How much time do you want to waste today?"
Ugyanez persze, ha a mi kezünkben a varázsbot, úgy nézne ki, hogy fogunk egy egységsugarú string mezőt, beállítjuk az értékét, azt kalap.
Valahogy így:
Aztán nézzük, mennyi az annyi:
Vagyis 2026 ms nettó, amiből ugye lejön az egyszeri költség, 500 ms, az annyi mint 1526 ms. Kb 6,32-szeres (menedzserek: 632%) gyorsulás. Ennek az aránynak a töredékéért ölnek a tőzsdén.
Nyilván ennek is van hátránya, mert ugye azt az extra mezőt le kell tárolni, de annyi példányt tipikusan nem tartunk memóriában Type osztályból, hogy ezen múljon.
Konklúzió
- Harmincezer, háromszázezer, vagy cache-elés.
- .NET Type FullName property-jét tessék óvatosan kezelni (ugyanez igaz a Namespace-re is btw)
- Soha ne bízzunk meg olyan kódban, ami képes a lényegét alkotó információt újra meg újra megkérdőjelezni