Zagadnienia dotyczące wydajności związane z międzyoperacyjnością (C++)

Ten temat zawiera wskazówki dla zmniejszenia efektu zarządzanych/niezarządzanych międzyoperacyjny przejścia na wydajność wykonywania.

Visual C++ obsługuje takich samych mechanizmów interoperacyjności w innych językach .NET, takich jak Visual Basic i C# (P i Invoke), ale także zapewnia wsparcie międzyoperacyjnego, specyficzne dla języka Visual C++ (C++ interop).Wydajność krytycznych aplikacji jest ważne, aby zrozumieć jego wpływu na wydajność każdej międzyoperacyjny techniki.

Niezależnie od zastosowanej techniki międzyoperacyjny sekwencje specjalne przejścia, o nazwie łącznikami, wymagane jest każdy zarządzanych funkcja wywołuje niezarządzanych funkcji i na odwrót.Te łącznikami są wstawiane automatycznie przez kompilator języka Visual C++, ale ważne jest, aby pamiętać, że łącznie, te przejścia mogą być drogie w zakresie wydajności.

Zmniejszenie przejścia

Jest jednym ze sposobów uniknięcia lub zmniejszenia kosztów międzyoperacyjny łącznikami byłaby interfejsów zaangażowanych w celu zminimalizowania przejścia zarządzanych/niezarządzanych.Dramatyczna wydajności można poprawić poprzez ukierunkowanie chatty interfejsy, które są te, które zaangażowane są wybierane często na granicy zarządzanych/niezarządzanych.Na przykład, zarządzane funkcję, która wywołuje funkcję niezarządzanych w pętlach, jest dobrym kandydatem na potrzeby refaktoryzacji.Jeżeli pętla, sam jest przenoszony do niezarządzanego po stronie lub jeśli zarządzanych alternatywą dla niezarządzanego wywołanie zostanie utworzony (być może być kolejkowania wiadomości danych po stronie zarządzanych i następnie kierowanie API niezarządzanego, jednocześnie po pętli), może być znacząco ograniczona liczba przejść.

Vs P i Invoke. C ++ Interop

Dla języków .NET, takich jak Visual Basic i C# metoda wymaganych podczas pracy z rodzimych komponentów jest P i Invoke.Ponieważ P i Invoke jest obsługiwany przez.NET Framework, Visual C++ obsługuje również, ale Visual C++ udostępnia również obsługę własną interoperacyjności, które są określone jako C ++ Interop.C ++ Interop jest preferowany przez P i Invoke, ponieważ P i Invoke nie jest typ palety.W rezultacie błędy są zgłaszane przede wszystkim w czasie wykonywania, ale C++ Interop również ma przewagę wydajności nad P i Invoke.

Obie techniki wymaga się zdarzyć w każdym przypadku, gdy funkcja zarządzanych wywoła funkcję niezarządzanych o kilku rzeczach:

  • Argumenty wywołania funkcji są przekazywane z CLR do rodzimych typów.

  • Thunk niezarządzany zarządzany jest wykonywany.

  • Wywołania funkcji niezarządzanych (za pomocą macierzystego wersje argumenty).

  • Jest wykonywany thunk niezarządzanych do zarządzanych.

  • Zwracany typ i wszelkich "out" lub "w, zewnętrzne" argumenty są przekazywane z rodzimych typów CLR.

Są niezbędne dla interop do pracy na wszystkich zarządzanych/niezarządzanych łącznikami, ale kierowanie danych, który jest wymagany zależy od typów danych zaangażowane, funkcja podpis i użycia danych.

Dane organizacyjne wykonywane przez element Interop C++ jest najprostszym formularzu możliwe: parametry są po prostu kopiowane na granicy zarządzanych/niezarządzanych w sposób wartość logiczną. transformacja nie jest wykonywana w ogóle.Dla P i Invoke, to tylko wartość true, jeśli wszystkie parametry są proste, typów istnieć.W przeciwnym razie P i Invoke wykonuje bardzo niezawodne kroki prowadzące do przekonwertowania każdego parametru zarządzanych do odpowiedniego typu macierzystego, i na odwrót, jeśli argumenty są oznaczone jako "out" lub "w, zewnętrzne".

Innymi słowy C ++ Interop używa najszybszą metodą możliwe dane organizacyjne, natomiast P i Invoke używa metody najbardziej niezawodny.Oznacza to, że Interop C++ (w sposób typowy dla języka C++) zapewnia optymalną wydajność domyślnie, a programista jest odpowiedzialny za adresowanie przypadkach gdy takie zachowanie nie jest bezpieczny lub właściwe.

C ++ Interop wymaga zatem dane organizacyjne, podaje się wyraźnie, że zaletą jest to, że programista ma możliwość wyboru, co jest właściwe, biorąc pod uwagę charakter danych i jak ma być używany.Ponadto mimo że zachowanie P i Invoke dane organizacyjne mogą być modyfikowane w dostosowane do stopnia, C ++ Interop pozwala kierowanie dostosowana na podstawie wywołań przez dane.Nie jest to możliwe z P i Invoke.

Aby uzyskać więcej informacji na temat C++ Interop, zobacz Korzystanie z międzyoperacyjności języka C++ (niejawna funkcja PInvoke).

Zobacz też

Koncepcje

Zestawy mieszane (natywne i zarządzane)