Zagadnienia dotyczące wydajności dla współdziałania z modelem (C++)
Ten temat zawiera wskazówki dla zmniejszenia wpływu zarządzanych/niezarządzanych międzyoperacyjne przejścia na wydajności w czasie wykonywania.
Visual C++ obsługuje jak inne mechanizmy interoperacyjności.NET języków, takich jak Visual Basic i C# (P/Invoke), ale oferuje również obsługę współdziałania, specyficzne dla języka Visual C++ (C++ interop).Wydajność krytycznych aplikacji jest zrozumieć wpływ na wydajność każdej technika współdziałania.
Niezależnie od zastosowanej techniki międzyoperacyjne sekwencji specjalne przejścia, o nazwie thunks, są wymagane przy każdym zarządzanym funkcja wywołuje niezarządzanego funkcji i na odwrót.Thunks te są wstawiane automatycznie przez kompilator Visual C++, ale warto pamiętać, że w sposób skumulowany, przejścia te mogą być kosztowne z punktu widzenia wydajności.
Zmniejszenie przejścia
Jednym ze sposobów uniknięcia lub zmniejszenia kosztów międzyoperacyjne thunks jest wewnętrznych zaangażowanych zminimalizować zarządzanych/niezarządzanych przejścia interfejsów.W celu dokonania dramatycznego wydajności można ukierunkowanie chatty interfejsów, które zaangażowane są wybierane przez granice zarządzanych/niezarządzanych.Zarządzanych funkcji, która wywoła funkcję niezarządzanego w pętli ścisła, na przykład, jest dobrym dla przeróbek.Jeśli sam pętli jest przenoszony do niezarządzanego po stronie lub jeśli zarządzanych alternatywą do niezarządzanego wywołanie jest tworzony (może być kolejkowania danych po stronie zarządzanych i następnie kierowanie niezarządzanego API, od razu po pętli), może być znacząco ograniczona liczba przejścia.
P/Invoke vs.C++ Interop
Dla.NET języków, takich jak Visual Basic i C# metody wyznaczonym do współpracy z macierzystym składników jest P/Invoke.Ponieważ P/Invoke jest obsługiwany przez.NET Framework program Visual C++ obsługuje ona także, ale Visual C++ obsługuje również własne interoperacyjności, określony jako C++ Interop.C++ Interop jest preferowanym P/Invoke ponieważ P/Invoke nie jest typu palety.W rezultacie błędy są zgłaszane głównie w czasie wykonywania, ale C++ Interop również ma przewagę wydajności nad P/Invoke.
Obie techniki wymaga się zdarzyć, gdy funkcja zarządzanych wywoła funkcję niezarządzanego kilka rzeczy:
Argumenty wywołania funkcji są przekazywane z CLR do typów macierzystym.
Thunk zarządzanych do niezarządzanych jest wykonywany.
Wywoływana jest funkcja niezarządzanego (za pomocą macierzystego wersje argumenty).
Wykonywane jest thunk niezarządzanych do zarządzanych.
Zwracany typ i wszelkich "out" lub "out," argumenty są przekazywane z macierzystym typu CLR.
Thunks zarządzanych/niezarządzanych są niezbędne do współdziałania z modelem do pracy na wszystkich, ale wymagany kierowanie danych zależy od zaangażowanych typy danych, podpisu funkcji i wykorzystania danych.
Kierowanie danych wykonywane przez C++ Interop jest Najprostszą formą możliwe: parametry są po prostu kopiowane granice zarządzanych/niezarządzanych bitowe sposób; transformacja nie jest wykonywane na wszystkich.P/Invoke, to tylko wartość true, jeśli wszystkie parametry są proste, typy istnieć.W przeciwnym razie P/Invoke wykonuje bardzo niezawodne kroki, aby przekonwertować każdego parametru zarządzanych na odpowiedni typ macierzysty i odwrotnie, jeśli argumenty są oznaczone jako "out" lub ", out".
Innymi słowy C++ Interop używa najszybsze możliwe metoda przekazywania międzyprocesowego danych, dlatego P/Invoke używa metody najbardziej niezawodne.Oznacza to, że Interop C++ (w sposób typowy dla C++) zapewnia optymalną wydajność, domyślnie i programista jest odpowiedzialny za adresowanie w przypadkach, gdy takie zachowanie nie jest bezpieczne lub właściwe.
C++ Interop wymaga zatem, że kierowanie danych musi posiadać wyraźnie, ale zaletą jest to, że programista jest decydujesz, co to jest właściwe, ze względu na charakter danych, i w jaki sposób ma być używany.Ponadto Chociaż zachowanie kierowanie danych P/Invoke mogą być modyfikowane w dostosowane do stopnia, C++ Interop umożliwia kierowanie do dostosowania na podstawie wywołań przez dane.Nie jest to możliwe z P/Invoke.
Aby uzyskać więcej informacji na temat C++ Interop, zobacz Za pomocą Interop C++ (niejawna PInvoke).