2015-05-18 2 views
4

Я вызываю две функции C++ из C#. Выполняя это на итерации около 1 миллиона звонков, я вижу накладные расходы около 30%. ФункцияНакладные расходы - вызов функции C++ из C#

C++:

EXTERN_C void STDAPICALLTYPE FunctionA(UINT_PTR mathId) 
{ 
    ... 
    ... 
} 

В моей C DLL # сборки как:

[DllImport("CPlusPlus.dll")] 
    public static extern void FunctionA([In] IntPtr mathID); 

Вызывается из функции, как показано ниже:

public static void HelpingFunction([In]UInt64 mathID) 
    { 
     FunctionA((IntPtr)mathID); 
    } 

Этот способ реализации создает больше накладных расходов, когда «HelpingFunction» называется более миллиона раз.

Может ли кто-нибудь дать мне другие идеи, чтобы сократить накладные расходы? Каковы другие способы вызова функции C++ из сборки C#?

+0

Очень трудно понять, как вы могли бы улучшить это, потому что мы не можем увидеть внутренности 'FunctionA'. –

+0

Вы также можете рассмотреть возможность создания оболочки CLI вокруг цикла, поэтому ваши накладные расходы сокращаются с «миллионов» вызовов до нескольких. –

ответ

7

Вы можете попробовать добавить SuppressUnmanagedCodeSecurityAttribute.

Позволяет управляемому коду звонить в неуправляемый код без стековой прогулки.

https://msdn.microsoft.com/en-us/library/system.security.suppressunmanagedcodesecurityattribute.aspx

Но на р/вызова вызова накладных расходов всегда будет фиксированная стоимость:

PInvoke имеет накладных расходов между 10 и 30 х86 на вызова. В дополнение к этой фиксированной стоимости маршалинг создает дополнительные накладные расходы. Нет никакой стоимости маршалинга между типами blittable, которые имеют одинаковое представление в управляемом и неуправляемом коде. Например, для нет необходимости переводить между int и Int32.

https://msdn.microsoft.com/en-us/library/ms235282.aspx

+0

действительно ли это означает добавление [System.Security.SuppressUnmanagedCodeSecurity] выше функции «Определение помощи (..)»? –

+0

нет, над DllImport или как это [DllImport ("CPlusPlus.dll"), System.Security.SuppressUnmanagedCodeSecurity] – SulNR