2011-09-30 17 views
5

Mam win32 dll i dwie aplikacje, które używa tej samej biblioteki dll. Jedna jest zapisywana przy użyciu c w niezarządzanej przestrzeni, a druga to aplikacja .net, która wywołuje kod niezarządzany za pomocą Pinvokes.Wydajność wywoływania niezarządzanego kodu z kodu zarządzanego

Czasami wydajność aplikacji .net jest lepsza niż aplikacja c. Technicznie rzecz biorąc wywoływanie niezarządzanego kodu z .net powoduje zwiększenie wydajności, ale nie w tym przypadku.

Sprawdziłem referencję msdn i wydaje się, że istnieje jakiś rodzaj przetwarzania wstępnego, który ma miejsce przed wykonaniem faktycznego połączenia. Podczas łączenia plik DLL jest ładowany.

Chcę zrozumieć, w jakich scenariuszach. Aplikacja internetowa działa lepiej?

+2

Jak mierzyć wydajność obu aplikacji i czy wszystkie inne logiki są dokładnie takie same dla obu? –

+1

Ogólnie, połączenia natywne powinny być szybsze, spójrz na to: http://www.codeproject.com/KB/dotnet/pinvokeperformance.aspx Czy jesteś pewien, że pomiary są prawidłowe? –

+0

@AvadaKedavra - Zmierzyłem konkretne wywołanie metody, używając stopera i czasu odpowiednio dla aplikacji .net i c. – sundar

Odpowiedz

5

Pinvoke marshaller jest jednym z najcięższych zoptymalizowanych fragmentów kodu w strukturze .NET. Bardzo ważne jest to, że podczas uruchamiania zarządzanego programu na niezarządzanym systemie operacyjnym nie ma zbyt wiele problemów. Ilość narzutu jest bardzo zmienna. Jest to zaledwie garstka cykli procesora, gdy biblioteka DLL jest już załadowana, a argumenty funkcji pinvoked są prostymi typami całkowymi. Do setek cykli, gdy, powiedzmy, konwersja ciągów znaków jest konieczna.

W żadnym wypadku nie jest szybszy niż połączenie lokalne. Pomiar naprężeń, który jest tylko garstką cykli, jest trudny. I pamiętaj, że możesz niechcący zmierzyć jakość swojego programu testowego zamiast wywołania pinvoke.

Powiązane problemy