Jaki jest "koszt" of.NET odbicie? [duplikat]

Możliwy duplikat:
jak kosztowne jest odbicie. NET?

Jestem obecnie w mentalności programowania, że refleksja jest moim najlepszym przyjacielem. Używam go często do dynamicznego ładowania zawartości, która pozwala na" luźną implementację", a nie ścisłe interfejsy, a także wiele niestandardowych atrybutów.

Jaki jest" rzeczywisty " koszt korzystania z odbicia?

Czy warto się starać, aby typy często odbijane miały buforowane odbicie, takie jak nasz własny kod obiektowy Pre-LINQ DAL na wszystkich właściwościach do definicji tabeli?

Czy pamięć podręczna przewyższa zużycie procesora refleksyjnego?

Author: Community, 2008-10-22

5 answers

Odbicie wymaga załadowania dużej ilości metadanych typu, a następnie przetworzenia. Może to skutkować większym obciążeniem pamięci i wolniejszym wykonywaniem. Zgodnie z Ten artykuł modyfikacja właściwości jest około 2,5 x-3x wolniejsza, a wywołanie metody jest 3,5 x-4X wolniejsze.

Oto doskonały artykuł MSDN opisujący, jak przyspieszyć refleksję i gdzie jest obciążenie. Gorąco polecam lekturę, jeśli chcesz dowiedzieć się więcej.

Istnieje również element złożoności, która może dodać do kodu, co czyni go znacznie bardziej mylącym, a tym samym trudnym do pracy. Niektórzy ludzie, jak np. Scott Hanselman, wierzą, że używając refleksji często tworzysz więcej problemów niż rozwiązujesz. Jest to szczególnie ważne, jeśli Twoje drużyny to głównie Juniorzy.

Możesz lepiej zajrzeć do DLR (Dynamic Language Runtime), jeśli potrzebujesz dużo dynamicznego zachowania. Wraz z nowymi zmianami w. NET 4.0 możesz sprawdzić, czy możesz włączyć część z nich do swojego rozwiązania. Dodana obsługa dynamicznych z VB i C# sprawia, że korzystanie z dynamicznego kodu jest bardzo eleganckie i tworzenie własnych dynamicznych obiektów jest dość proste.

Powodzenia.

EDIT: trochę poszperałem po stronie Scotta i znalazłem tenpodcast po namyśle. Nie słuchałem go, ale może warto.

 54
Author: smaclell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-17 12:35:45

Jest wiele rzeczy, które możesz zrobić, aby przyspieszyć refleksję. Na przykład, jeśli robisz dużo dostępu do właściwości, wtedy HyperDescriptor może być przydatny.

Jeśli wykonujesz wiele metod-invoke, wtedy możesz buforować metody do typowanych delegatów używając Delegate.CreateDelegate - to wtedy sprawdza typ itd tylko raz (podczas CreateDelegate).

Jeśli robisz dużo budowy obiektów, to Delegate.CreateDelegate nie pomoże ( nie możesz użyć go na konstruktorze) - ale (w 3.5) Expression może być użyty do zrób to, ponownie kompilując do wpisanego delegata.

Więc tak: odbicie jest powolne, ale można je zoptymalizować bez zbytniego bólu.

 16
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 06:01:58

Z wielką mocą przychodzi wielka odpowiedzialność.

Jak mówisz, odbicie wiąże się z kosztami i w zależności od tego, ile odbicia zrobisz, może znacznie spowolnić aplikację.

Jednym z bardzo approrpiate miejsc, aby go używać jest IoC (Inwersja kontroli), ponieważ, w zależności od wielkości aplikacji, prawdopodobnie ma więcej korzyści niż nie.

 2
Author: Llyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 02:18:58

Dzięki za świetne linki i świetne komentarze, szczególnie ze strony twórców Jr, którzy trafili prosto na pieniądze.

Dla nas łatwiej jest to zrobić naszym młodszym programistom:
[TableName("Table")]
public class SomeDal : BaseDal
{
    [FieldName("Field")]
    public string Field
}
A nie jakieś większe impelementy DAL. To przyspiesza ich budowę obiektów DAL, jednocześnie ukrywając wszystkie wewnętrzne prace dla starszych deweloperów, aby wypatroszyć.

Szkoda, że LINQ nie wyszedł wcześniej, mam wrażenie, że czasami pisaliśmy połowę.

 1
Author: Tom Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-22 10:05:39

Jedną z rzeczy, która czasami może cię ugryźć, gdy używasz reflection, jest nie aktualizowanie wywołań za pomocą reflection podczas refaktoryzacji. Narzędzia takie jak resharper poproszą Cię o zaktualizowanie komentarzy i ciągów znaków po zmianie nazwy metody, dzięki czemu możesz przechwycić większość z nich w ten sposób, ale gdy wywołujesz metody, które zostały wygenerowane dynamicznie lub nazwa metody została wygenerowana dynamicznie, możesz coś przegapić.

Jedynym rozwiązaniem jest dobra dokumentacja i dokładne testy jednostkowe.

 0
Author: jonnii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-24 15:58:05