Sdílet prostřednictvím


Důležité informace o výkon pro Interop (C++)

Toto téma obsahuje pokyny pro snížení působení spravované/nespravované vzájemné spolupráce přechodů na běhu výkonu.

Visual C++ podporuje stejné mechanismy spolupráce jako jiné .NET jazyky, jako například Visual Basic a C# (P/Invoke), ale také poskytuje podporu vzájemné spolupráce, specifickou pro aplikaci Visual C++ (C++ interop). Pro výkonově kritické aplikace je důležité porozumět důsledkům výkonu každé techniky vzájemné spolupráce.

Bez ohledu na použitou techniku vzájemné spolupráce, jsou speciální sekvence přechodu, nazvané převody, požadovány pokaždé, když spravovaná funkce volá nespravovanou funkci a naopak. Tyto převody budou automaticky vloženy pomocí kompilátoru Visual C++, je ale důležité mít na paměti, že kumulativně mohou být tyto přechody nákladné z hlediska výkonu.

Snížení přechodů

Jedním ze způsobů jak vyloučit nebo snížit náklady převodů vzájemné spolupráce je refaktorovat rozhraní, zapojená do minimalizace spravovaných/nespravovaných přechodů. Výrazné zlepšení výkonu lze provést zaměřením chatty rozhraní, což jsou ty, kterých se týká časté volání přes spravované/nespravované hranice. Spravovaná funkce, která volá nespravovanou funkci v často opakované smyčce, což je například vhodný kandidát pro refaktoring. Pokud je smyčka samotná přesunuta na nespravovanou stranu nebo pokud je vytvořena spravovaná alternativa k nespravovanému volání (třeba fronta dat na spravované straně a jejich zařazování do nespravovaného rozhraní API najednou po smyčce), lze podstatně snížit počet přechodů.

P/Invoke vs.Interoperabilita C++

Pro .NET jazyky, jako jsou například Visual Basic a C#, je P/Invoke předepsanou metodou pro vzájemnou spolupráci s nativními komponentami. Vzhledem k tomu, že rozhraní .NET Framework podporuje P/Invoke, podporuje ho Visual C++ také, ale Visual C++ také poskytuje vlastní podporu vzájemné funkční spolupráce, která je označována jako Interoperabilita C++. Interoperabilita C11 je upřednostňována před P/Invoke, protože P/Invoke není bezpečného typu. V důsledku toho jsou primárně hlášeny chyby za běhu, protože Interoperabilita C++ má také výhody výkonu oproti P/Invoke.

Obě metody vyžadují několik kroků k provedení volání nespravované funkce ze spravované funkce:

  • Argumenty volané funkce jsou zařazovány z CLR typů na nativní typy.

  • Je proveden spravovaný-nespravovaný převod.

  • Je zavolána nespravovaná funkce (použitím nativních verzí argumentů).

  • Je proveden nespravovaný-spravovaný převod.

  • Návratový typ a všechny "out" nebo "in, out" argumenty jsou zařazeny z nativních typů na CLR typy.

Spravované/nespravované převody jsou nezbytné pro práci vzájemné funkční spolupráce, ale zařazování dat, které je požadováno, závisí na souvisejících datových typech, podpisu funkce a způsob použití dat.

Zařazování dat, prováděné Interoperabilitou C++, je nejjednodušším možným způsobem: Parametry jsou jednoduše zkopírovány přes spravované/nespravované hranice v bitovém tvaru; není provedena žádná transformace. Pro P/Invoke to platí pouze v případě, že jsou všechny parametry jednoduché, blittable typy. V opačném případě provede P/Invoke velmi robustní kroky k převedení každého spravovaného parametru na odpovídající nativní typ, a naopak, pokud jsou argumenty označeny jako "out" nebo "in, out".

Jinými slovy Interoperabilita C++ používá nejrychlejší možnou metodu zařazování dat, vzhledem k tomu, že P/Invoke používá více robusní metodu. To znamená, že Interoperabilita C++ (ve tvaru typickém pro jazyk C++) poskytuje optimální výkon ve výchozím nastavení a programátor zodpovídá za adresování v případech, kdy toto chování není bezpečné nebo vhodné.

Interoperabilita C++ proto vyžaduje, že zařazování dat musí být poskytnuto explicitně, ale výhodou je, že se programátor může rozhodnout, co je vhodné pro danou povahu dat a jak mají být použita. Dále ačkoliv chování zařazování dat P/Invoke lze změnit na míru upravitelnosti, umožňuje Interoperabilita C++ zařazování dat, upravitelné na základě volání. To není možné s P/Invoke.

Další informace o Interoperabilitě C++, naleznete v tématu Použití interoperability C++ (implicitně PInvoke).

Viz také

Koncepty

Smíšená (nativní a spravovaná) sestavení