Есть ли заметное снижение производительности при вызове PInvoke для методов Win32 / COM? - PullRequest
25 голосов
/ 08 апреля 2011

Мне интересно, есть ли у кого-нибудь достойное объяснение или обзор негативных аспектов использования DLLImport / PInvoke для методов Win32 из управляемого кода .Net?

Я планирую использовать различные методы Win32 и хотел бы лучше понять негативные последствия этого.

Спасибо

Брайан.

Ответы [ 2 ]

34 голосов
/ 09 апреля 2011

Согласно MSDN - вызов собственных функций из управляемого кода

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

По моему опыту, при P / Invoking собственных функциях определенно возникают накладные расходы, но обычно снижение производительности не стоит беспокоить.,Стоит помнить о стоимости маршалинга.Если вы передаете большие структуры, строки и т. Д., Тогда затраты на производительность будут быстро отображаться.

Для P / Вызванных функций, которые вызываются очень часто, вы можете рассмотреть возможность добавления [SuppressUnmanagedCodeSecurity] к вашему P /Вызвать определения функций (см. MSDN - SuppressUnmanagedCodeSecurityAttribute ).Это мешает среде выполнения выполнять обход стека, чтобы гарантировать, что вызывающая сторона имеет разрешение UnmanagedCode.Конечно, перед добавлением этого атрибута убедитесь, что вы понимаете последствия для безопасности.

3 голосов
/ 08 апреля 2011

Вот некоторые проблемы, с которыми я сталкиваюсь в PInvoke:

  • Маршалинг параметров может быть дорогостоящим, в зависимости от типа данных (blittable / non-blittable)
  • Правильный маршалинг параметров частоне очень интуитивно понятный
  • PInvoke не обеспечивает никакой безопасности во время компиляции.Можно легко ошибиться в написании DLL или имен функций без жалоб компилятора.

Если вы планируете использовать множество неуправляемых функций, я бы создал смешанную DLL (http://msdn.microsoft.com/en-us/library/x0w2664k.aspx), а не объявлял кучу PInvokes).

...