Оптимизация вызова 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 ++ будет вызываться из встроенных вспомогательных функций.

Спасибо,

./ Рахул

1

Решение

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

1

Другие решения

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

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

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

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

0