Faktory ovlivňující výkon u zprostředkovatelů komunikace (C++)
Toto téma obsahuje pokyny pro omezení vlivu spravovaných nebo nespravovaných přechodů zprostředkovatele komunikace na výkon za běhu.
Visual C++ podporuje stejné mechanismy interoperability jako jiné jazyky .NET, jako je Visual Basic a C# (P/Invoke), ale poskytuje také podporu vzájemné spolupráce, která je specifická pro interoperabilitu Visual C++ (interoperabilita C++). U důležitých aplikací s výkonem je důležité porozumět důsledkům výkonu jednotlivých technik vzájemné spolupráce.
Bez ohledu na použitou techniku vzájemné spolupráce jsou při každém volání nespravované funkce vyžadovány speciální přechodové sekvence označované jako řazené bloky. Tyto bloky jsou vloženy automaticky kompilátorem Jazyka C++, ale je důležité mít na paměti, že kumulativní, tyto přechody mohou být nákladné z hlediska výkonu.
Omezení přechodů
Jedním ze způsobů, jak se vyhnout nebo snížit náklady na zprostředkovatele interoperability, je refaktorovat zahrnutá rozhraní, aby se minimalizovaly spravované nebo nespravované přechody. Dramatická vylepšení výkonu se dají dosáhnout cílením na rozhraní chatování, což jsou ty, které se týkají častých volání napříč spravovanými nebo nespravovanými hranicemi. Spravovaná funkce, která volá nespravovanou funkci v těsné smyčce, je například vhodným kandidátem pro refaktoring. Pokud se samotná smyčka přesune na nespravované straně nebo pokud se vytvoří spravovaná alternativa k nespravovanému volání (třeba se zařadí data do fronty na spravované straně a pak je zařaďte do nespravovaného rozhraní API najednou po smyčce), může se výrazně snížit počet přechodů.
Volání nespravovaného kódu vs. zprostředkovatele komunikace C++
Pro jazyky .NET, jako je Visual Basic a C#, je předepsané metody pro spolupráci s nativními komponentami P/Invoke. Vzhledem k tomu, že rozhraní .NET Framework podporuje volání nespravovaného kódu, podporuje ho i Visual C++, ale Visual C++ také poskytuje vlastní podporu interoperability, která se označuje jako interoperabilita jazyka C++. Zprostředkovatel komunikace C++ je upřednostňovaný před voláním nespravovaného kódu, protože volání nespravuje typově bezpečné. V důsledku toho se chyby primárně hlásí za běhu, ale interoperabilita C++ má také výhody výkonu oproti volání nespravovaného kódu.
Obě techniky vyžadují několik věcí, ke kterým může dojít, když spravovaná funkce volá nespravovanou funkci:
Argumenty volání funkce jsou zařazovány z CLR na nativní typy.
Spustí se nespravovaný blok dat spravovaných na nespravovaný.
Nespravovaná funkce je volána (pomocí nativních verzí argumentů).
Spustí se nespravovaný blok pro správu.
Návratový typ a všechny argumenty "out" nebo "in" jsou zařazovány z nativních typů do CLR.
Spravované nebo nespravované bloky dat jsou nezbytné k tomu, aby spolupráce fungovala vůbec, ale požadované zařazování dat závisí na datových typech, podpisu funkce a způsobu použití dat.
Zařazování dat prováděné interopem jazyka C++ je nejjednodušší možnou formou: parametry se jednoduše zkopírují přes spravovanou nebo nespravovanou hranici bitovým způsobem; žádná transformace se vůbec neprovádí. Pro volání nespravovaného kódu je to pravda, pouze pokud jsou všechny parametry jednoduché, blittable typy. V opačném případě volání nespravovaného kódu provádí velmi robustní kroky pro převod každého spravovaného parametru na odpovídající nativní typ a naopak, pokud jsou argumenty označené jako out nebo in, out.
Jinými slovy, interop jazyka C++ používá nejrychlejší možnou metodu zařazování dat, zatímco P/Invoke používá nej robustnější metodu. To znamená, že spolupráce C++ (v módě typická pro C++) ve výchozím nastavení poskytuje optimální výkon a programátor zodpovídá za řešení případů, kdy toto chování není bezpečné nebo vhodné.
Spolupráce C++ proto vyžaduje, aby bylo možné explicitně zadat zařazování dat, ale výhodou je, že programátor může rozhodnout, co je vhodné, vzhledem k povaze dat a způsobu jejich použití. I když chování zařazování dat volání nespravovaného kódu je možné upravit na míru, interoperability jazyka C++ umožňuje přizpůsobení zařazování dat na základě volání. To není možné u volání nespravovaného kódu.
Další informace o interoperabilitě C++ naleznete v tématu Použití zprostředkovatele komunikace C++ (implicitní PInvoke).