2011-09-30 24 views
5

Tengo un dll win32 y dos aplicaciones que usan el mismo dll. Uno se escribe usando c en el espacio no administrado y el otro es la aplicación .net que realiza llamadas al código no administrado mediante Pinvokes.Rendimiento de invocar código no administrado desde el código administrado

A veces el rendimiento de la aplicación .net es mejor que la aplicación c. Técnicamente hablando, la invocación de código no administrado desde .net genera una sobrecarga de rendimiento, pero no en este caso.

Comprobé la referencia msdn y parece que hay algún tipo de preprocesamiento que ocurre antes de que se realice la llamada real. Durante el enlace, se carga el dll.

Quiero entender en qué escenarios la aplicación .net supera?

+2

¿cómo se mide el rendimiento de las dos aplicaciones, y todas las otras lógicas son exactamente las mismas para las dos? –

+1

Generalmente, las llamadas nativas deben ser más rápidas, mira esto: http://www.codeproject.com/KB/dotnet/pinvokeperformance.aspx ¿Estás seguro de que tus medidas son correctas? –

+0

@AvadaKedavra - Medí una llamada a un método particular usando el cronómetro y el tiempo para la aplicación .net y c, respectivamente. – sundar

Respuesta

5

El marshaller pinvoke es uno de los trozos optimizados más pesados ​​de código en el marco .NET. Muy importante, hay muchas señales que no se pueden ver cuando se ejecuta un programa administrado en un sistema operativo no administrado. La cantidad de sobrecarga es muy variable. No es más que un puñado de ciclos de CPU cuando la DLL ya está cargada y los argumentos para la función pinvoked son simples tipos integrales. Para muchos cientos de ciclos cuando, por ejemplo, las conversiones de cadena son necesarias.

En ninguna circunstancia es más rápido que una llamada nativa. Medir la sobrecarga que es solo un puñado de ciclos con precisión es difícil. Y tenga en cuenta que puede medir involuntariamente el rendimiento de su programa de prueba en lugar de la llamada pinvoke.

Cuestiones relacionadas