956 messaggi dal 29 aprile 2002
Mi chiedevo, se una chiamata ad un metodo, la creazione di una istanza di classe, o una qualsiasi operazione su un tipo di un assembly caricato con reflection è comunque + lenta rispetto ad una stessa operazione senza reflection.
Insomma ho un dubbio: una volta caricato l'assembly.. i tipi e tutto il resto in esso contenuto non stanno in memoria? o meglio nell'istanza del tipo Assembly (e quindi in memoria) ? e quindi la chiamata ad un loro metodo o ad una proprietà ha le stesse performance di una chiamata naturale?

non sò se mi sono spiegato :D
3.082 messaggi dal 06 settembre 2002
Contributi | Blog

Nothing can be born from hartred

Stefano (SM15455) Mostarda
http://blogs.aspitalia.com/SM15455
Rome Italy
956 messaggi dal 29 aprile 2002
sm15455 ha scritto:
Ciao,

Semplicemente è più lenta SEMPRE.

esistono comuque delle tecniche per mitigare la lentezza.

http://blogs.aspitalia.com/ricciolo/post2332/Reflection-Migliorare-Performance.aspx http://blogs.aspitalia.com/ricciolo/post2335/LINQ-Reflection.aspx http://blogs.aspitalia.com/ricciolo/post2336/LINQ-Reflection-Parte.aspx
HTH

grazie, stavo pensando anche alla cache, cioè a mettere in cache un assembly, se si può ovviamente.. mah..
>stavo pensando anche alla cache, cioè a mettere in cache un assembly

Questa mi mancava!

imperugo
Microsoft MVP
myblog : http://www.tostring.it
176 messaggi dal 04 giugno 2007
Contributi | Blog
Vorrei essere sicuro di capire la tua domanda, perche' stai mescolando due concetti diversi ma correlati.

Da un lato, tramite reflection, puoi dinamicamente esplorare e scoprire un tipo. Ovviamente, questo tipo di accesso ai dati e' sempre piu' lento dell'accesso nativo in quanto richiede l'esplorazione di strutture dati del runtime per accedere alle caratteristiche del tipo.
Tutte queste funzionalita' sono esposte nel namespace System.Reflection

Dall'altro lato, tramite Reflection.Emit, puoi generare dinamicamente un assembly e caricarlo. In questo caso, se una volta caricato accedi all'assembly senza passare tramite reflection, il fatto che l'assembly sia stato generato dinamicamente da te diventa irrilevante.

C'e' anche un terzo caso, in cui invece di generare e caricare un intero assembly in memoria passando dal file system (e quindi avendo il problema di non poterlo scaricare senza scaricare tutto l'appdomain) puoi generare metodi (ma non tipi) sul garbage collection heap tramite la Lightweight Code Generation. Le RegEx di .NET sono implementate con questa tecnica.

Saluti

--Alessandro
956 messaggi dal 29 aprile 2002
imperugo ha scritto:
>stavo pensando anche alla cache, cioè a mettere in cache un assembly

Questa mi mancava!

ti è nuova la gac?
956 messaggi dal 29 aprile 2002
AlessC-MSFT ha scritto:
C'e' anche un terzo caso, in cui invece di generare e caricare un intero assembly in memoria passando dal file system (e quindi avendo il problema di non poterlo scaricare senza scaricare tutto l'appdomain) puoi generare metodi (ma non tipi) sul garbage collection heap tramite la Lightweight Code Generation. Le RegEx di .NET sono implementate con questa tecnica.

Saluti

--Alessandro

interessante grazie ;)
>ti è nuova la gac?

Assolutamente no, ma non credo che mettendo un'assembly in GAC hai un aumento di performance.
Il vantaggio che sicuramente puoi trarre dall'aggiungere un'assembly in GAC, oltre al fatto di averla condivisa a livello di macchina, sta nella verifica dell'hash dello strong name che, nel caso sia in gac, viene verificato nel momento dell'installazione, e non ad ogni avvio come spiegato qui da Claudio Caldato (che Alessandro sicuramente conosce bene):

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx

Ciauz

imperugo
Microsoft MVP
myblog : http://www.tostring.it

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.