Оптимизация вызова C++ из C#

Я звоню два вызова функции C++ из C# мой код ниже.

[DllImport("A.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "FuncA"), System.Security.SuppressUnmanagedCodeSecurity]
    public static extern void FuncA(UInt64 functionID);

В C++ код это:

EXTERN_C void STDMETHODCALLTYPE FuncA(UINT_PTR functionId)
{
    return;
}

Эта функция вызывается из C# в C++ около 2 миллионов раз. Без этого вызова функции мой веб-запрос завершается за 5,9 секунды.. И с этим вызовом функции я получаю 7,1 секунды..

Приблизительно 15% накладных расходов. Я уже использовал "SuppressUnmanagedCodeSecurity", увидев сообщение, которое уменьшило накладные расходы с 30% до 15 % . Но есть ли другой способ уменьшить эти накладные расходы на 15 % .??

Update1:

Идентификатор функции должен быть отправлен на C++ для каждого вызова функции C#. Функция C++ не является пустой функцией. Он должен хранить идентификаторы функций в STL, и другой поток будет их обрабатывать. Я занимаюсь.NET-профилировщиком. Мне нужно профилировать каждый вызов функции. Эта функция FuncA C++ будет вызываться из встроенных вспомогательных функций.

Спасибо,

./Rahul

2 ответа

В качестве краткого описания вы можете создать управляемую статическую библиотеку C++ CLI, которая вызывает неуправляемые функции C++ с меньшим снижением производительности и добавляет ее в качестве ссылки на библиотеку C++/CLI в вашем проекте C#. Затем приложение C# может выполнять вызовы управляемых методов к связанной библиотеке CLI C++, что, в свою очередь, может вызывать неуправляемые вызовы методов. Хотя это приводит к некоторой косвенности, это может обеспечить некоторое увеличение производительности.

Что делает функция C++? Это действительно пустой метод? Это необходимый шаг в вашей цепочке действий?

Возможно, быстрее переписать этот метод в C#, чтобы включить его в рабочий процесс, не вызывая внешние (возможно, небезопасные) методы.

Если действие, выполняемое кодом C++, не имеет ничего общего с остальной частью вашего потока, возможно, вы могли бы выиграть некоторое время, запустив его в фоновом режиме или в отдельном потоке, так что ваш код C# не должен ждать для кода для запуска. Я предполагаю, что это может быть допустимой опцией, так как ваш метод возвращает void.

Возможно, немного больше информации о том, почему и как может помочь нам найти более подходящий ответ.

Другие вопросы по тегам