¿Hay generalmente un golpe de rendimiento notable al llamar a PInvoke en los métodos Win32 / COM?


Me pregunto si alguien tiene una explicación decente o una visión general sobre los aspectos negativos del uso de DllImport / PInvoke en métodos Win32 desde código. Net administrado?

Planeo hacer uso de varios métodos de Win32 y me gustaría tener una mayor comprensión de las implicaciones negativas de hacerlo.

Gracias,

Brian.
Author: Brian Scott, 2011-04-08

2 answers

De acuerdo con MSDN-Llamando a Funciones Nativas desde Código Administrado

PInvoke tiene una sobrecarga de entre 10 y 30 instrucciones x86 por llamada. Además de este costo fijo, la clasificación crea gastos generales adicionales. No hay costo de marshal entre tipos blittable que tienen la misma representación en código administrado y no administrado. Por ejemplo, no hay costo para traducir entre int y Int32.

En mi experiencia, definitivamente hay una sobrecarga cuando P / Invocando funciones nativas, pero normalmente no vale la pena preocuparse por el impacto en el rendimiento. El costo de la clasificación es algo a tener en cuenta. Si está pasando en estructuras grandes, cadenas, etc. entonces los costos de rendimiento se mostrarán rápidamente.

Para las funciones P/Invocadas que se llaman con mucha frecuencia, puede considerar agregar [SuppressUnmanagedCodeSecurity] a sus definiciones de función P/Invoke (vea MSDN - SuppressUnmanagedCodeSecurityAttribute). Esto evita que el tiempo de ejecución realice una caminata de pila para asegurarse de que la persona que llama tiene permiso UnmanagedCode. Por supuesto, asegúrese de comprender las ramificaciones de seguridad antes de agregar este atributo.

 28
Author: Lee Berger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-08 21:15:16

Aquí hay algunos problemas que veo con PInvoke:

  • La clasificación de parámetros puede ser costosa, dependiendo del tipo de datos (blittable / non-blittable)
  • La clasificación correcta de parámetros a menudo no es muy intuitiva
  • PInvoke no proporciona ninguna seguridad en tiempo de compilación. Uno puede escribir mal los nombres de DLL o funciones fácilmente sin que el compilador se queje.

Si planea usar muchas funciones no administradas, crearía una DLL mixta (http://msdn.microsoft.com/en-us/library/x0w2664k.aspx) en lugar de declarar un montón de PInvokes.

 3
Author: Florian Greinacher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-08 08:57:38