Есть ли преимущество в производительности при использовании небезопасных вызовов P / Invoke по сравнению с обычными вызовами P / Invoke? - PullRequest
4 голосов
/ 26 апреля 2011

Я хочу использовать P / Invoke, чтобы позволить моей сборке C # взаимодействовать с собственной библиотекой C;он должен быть кроссплатформенным (т.е. моно), поэтому сборка в смешанном режиме не может быть использована.Мне интересно, есть ли какое-либо преимущество в производительности при использовании небезопасных вызовов P / invoke и обработке всех преобразований в указатели в небезопасном методе по сравнению с обычным «безопасным» вызовом P / Invoke.Заранее спасибо!

Уточнение: Я не собираюсь использовать управляемую оболочку C ++, как обсуждается здесь .Я просто хочу знать, есть ли различия в производительности между:

extern static void native_call_here(IntPtr parameter1, String parameter2)

и

extern static void native_call_here(int* parameter1, char* parameter2)

1 Ответ

4 голосов
/ 26 апреля 2011

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

...