2011-11-01 17 views
7

Czy istnieje prosty sposób uzyskania kodu JIT z przodu, zamiast czekać na pierwszy raz wywołania kodu? Czytałem o NGEN, ale nie sądzę, że to mi pomoże.Unikanie nadmiaru JIT C#

Moja aplikacja czeka i odpowiada na określone zdarzenie zewnętrzne pochodzące z portu UDP, a żaden z kodów ścieżki krytycznej nie jest (a) uruchamiany przed nadejściem zdarzenia, lub (b) kiedykolwiek jest uruchamiany ponownie, więc koszt JIT jest wysoki w tym scenariuszu. Sprawdzanie w narzędziu profilowania ANTS nakład na JIT wynosi około 40-50%, czasami jest aż 90%. Moja aplikacja jest bardzo wrażliwa na opóźnienia i liczy się każda milisekunda.

Moja początkowa myśl polega na tym, że mogę dodać parametr bool do każdej metody ścieżki krytycznej i wywołać te metody przed wystąpieniem zdarzenia, aby zainicjować kompilację JIT. Czy jest jednak ładniejszy i mniej odrażający sposób?

Wielkie dzięki

+10

Dlaczego firma NGEN nie mogłaby Ci pomóc? –

+2

Czy ustaliłeś, że to problem? A może po prostu myślisz, że to może być? –

+0

Jestem (praktycznie) pewien, że to problem Henka. Właśnie zaimplementowałem na jednej metodzie moje hacky podejście i narzut JIT dla tej metody w ANTS profilera zniknął. – endian

Odpowiedz

5

Powiedziałbym, że używam NGEN, a jeśli to nie działa, prawdopodobnie masz głębsze problemy.

Ale, aby odpowiedzieć na twoje pytanie, ten artykuł o tym, jak pre-jit używa System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod, aby wymusić JIT. Zawiera przykładowy kod do użycia refleksji, aby uzyskać obsługę metody.

+2

Doskonale, dzięki. Znalazłem również artykuł CodeProject (!), Który opakowuje wywołania PrepareMethod dla całych typów. Link tutaj: http://www.codeproject.com/KB/dotnet/Jitting.aspx. – endian

3

Co stanie się po raz drugi, gdy nadejdzie wydarzenie? Czy to jest szybsze, czy tak samo powolne. Jeśli nadal jest wolny, to JIT nie jest problemem, ponieważ kod otrzymuje "JIT" ed tylko raz, przy pierwszym uruchomieniu.

Firma NGEN udzieli odpowiedzi. Moją sugestią jest wziąć minimum kodu, którego potrzebujesz, krytycznej ścieżki, jeśli chcesz, i umieścić go w projekcie dummy/sandbox. Rozpocznij profilowanie/dołączenie tego kodu i zobaczenie wydajności.

Jeśli ten absolutny minimalny kod, nawet jeśli NGEN ma słabe działanie w przypadku wielu połączeń, wstępne kompilowanie nie pomoże. Jest to coś innego w kodzie, który powoduje szyjki butelek.

+0

Kod jest błyskawicznie szybki po pierwszym zdarzeniu.Jak wspomniałem powyżej, stwierdziłem, że to z pewnością JIT narzut powoduje problemy z wydajnością. Jestem w trakcie dodawania obciążenia wywołań do RuntimeHelpers.PrepareMethod, mam nadzieję, że spowoduje usunięcie tego problemu. – endian