EntityFramework – uważajcie, jesteście śledzeni

Moją przygodę z Entity Framework zacząłem od przeczytania jednej z książek poświęconej właśnie temu frameworkowi. Później miałem jeszcze okazję spotkać się z nim w kilu projektach. Zawsze starałem się pisać kod zgodnie z moją najlepszą wiedzą, tak aby jakość produktu końcowego była jak najwyższa. Możecie sobie wyobrazić, jakie było moje rozczarowanie, kiedy dopiero po kilku latach dowiedziałem się o możliwości wyłączenia śledzenia.

Dlaczego rozczarowanie? Dlatego, że mimo dość długiej pracy nie natknąłem się na to wcześniej, a więc byłem nieświadomy wszystkich możliwości konfiguracyjnych. Bardzo możliwe, że gdzieś tam jest kod, który został napisany przeze mnie i prawdopodobnie mógłby działać szybciej gdybym napisał go dziś – bardziej świadomy i bogatszy o nową wiedzę i doświadczenia.

Ale do rzeczy! Entity Framework domyślnie śledzi wszystkie pobrane obiekty z bazy. Dzięki temu może łatwo wykryć, które obiekty zostały zmodyfikowane lub usunięte. Jest to duże udogodnienie, które zazwyczaj świetnie się sprawdza. Ale czy zawsze jest nam potrzebne? Jestem przekonany, że co najmniej kilka razy w przeszłości mogłem obejść się bez tego mechanizmu. Śledzenie może zostać wyłączone za pomocą metody AsNoTracking, które wywołuje się dla konkretnego zapytania. No dobrze, ale co z tego wynika? Otóż wyłączając tracking możemy zwiększyć wydajność naszej aplikacji i zmniejszyć wykorzystywaną pamięć.

Celem tego posta jest podzielenie się moimi obserwacjami, związanymi z szybkością działania zapytań, wykonywanych przez Entity Framework z włączonym i wyłączonym śledzeniem. Napisałem bardzo prosty kod testujący szybkość działania zapytań. Testowana jest różnica pomiędzy tymi dwoma zapytaniami:

Korzystam z testowej bazy danych zawierającej około 17 tysięcy rekordów. Jej struktura nie ma tutaj większego znaczenia. Poniżej znajduje się wykres przedstawiający otrzymane wyniki. Możemy tu zobaczyć jak czas wykonania zapytań (mierzony w milisekundach) wzrasta wraz ze wzrostem liczby pobieranych rekordów.

Być może różnica kilkudziesięciu milisekund nie robi na was większego wrażenia, ale z drugiej strony nie raz zdarza nam się szukać miejsc w kodzie, które można zoptymalizować pod względem czasu wykonania. To rozwiązanie jest bardzo proste i nie niesie ze sobą żadnych ryzykownych zmian. Zbadałem również jak zmieniło się zużycie pamięci mojej aplikacji. Spadło ze 117 MB (włączone śledzenie) do 87 MB (wyłączone śledzenie).

Warto jest być świadomym tego jak działa śledzenie w Entity Framework’u i jaki narzut ze sobą niesie. Pamiętaj jednak, że wyłączenie śledzenia ma sens tylko w specyficznych przypadkach. Zazwyczaj korzystniej z punktu widzenia wydajności jest zostawić je włączone.

Dodaj komentarz

Twój adres email nie będzie opublikowany. Pola wymagane zostały oznaczone *