win32print win32file net for extensions extension .net performance pinvoke marshalling dllimport

.net - win32file - win32com python



¿Hay generalmente un impacto notable en el rendimiento al llamar a PInvoke en los métodos Win32/COM? (2)

Aquí hay algunos problemas que veo con PInvoke:

  • El cálculo de parámetros puede ser costoso, dependiendo del tipo de datos (blittable / non-blittable)
  • El cálculo de parámetros correcto a menudo no es muy intuitivo
  • PInvoke no proporciona ninguna seguridad de tiempo de compilación. Uno puede escribir mal los nombres de funciones o DLL 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.

Me pregunto si alguien tiene una explicación o una descripción decente sobre los aspectos negativos del uso de los métodos DLLImport / PInvoke on Win32 desde el código .Net administrado.

Planeo hacer uso de varios métodos de Win32 y me gustaría entender mejor las implicaciones negativas de hacerlo.

Gracias,

Brian


Según MSDN - Llamar 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, el cálculo de referencias crea una sobrecarga adicional. No hay costo de cálculo de referencias entre los tipos de blittable que tienen la misma representación en el 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 / Invocar funciones nativas, pero generalmente no vale la pena preocuparse por el impacto en el rendimiento. El costo de cálculo es algo a tener en cuenta. Si está pasando estructuras grandes, cadenas, etc., los costos de rendimiento se mostrarán rápidamente.

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