¿Qué se puede hacer para acelerar la llamada a métodos nativos desde el código administrado?Optimizar llamadas administradas a nativas
Estoy escribiendo un programa que necesita para poder administrar listas de objetos de tamaño arbitrario y recuperar información de ellos a alta velocidad, que se alimenta a los scripts. Los scripts son bits del código compilado C#. Estoy escribiendo una capa de interfaz básica desde el DLL/SO/etc de C++ (nativo) a la capa de gestión C# (.Net o Mono).
Ahora, he estado haciendo algunas pruebas, y he encontrado que, en promedio, Invocar un método nativo desde código administrado es algo así como 100 veces más lento que hacerlo todo administrado (todos nativos y todos administrados son idénticamente) rápido, para referencia).
La sintaxis que estaba usando es:
[DllImport("test.dll")]
extern static public String test_method(String value);
String returnedValue = test_method("hello world");
¿Hay una manera de almacenar en caché un puntero a la función, un código de invocador rápido, que aumentaría la velocidad después de cargar la biblioteca nativa? Eso resolvería el problema bastante bien, así que dudo que exista. : P
Edit: No especifiqué, pero esto debe funcionar en Windows, Linux (Ubuntu al menos) y Mac OS X, todos para x86 y x64. De lo contrario, me habría ido con una interfaz C++/CLI y habría terminado con eso, pero a menos que eso funcione para las 3 plataformas, no puedo usarlo.
Quizás haya alguna conversión de cadenas y juegos de caracteres que ralentiza esto. ¿Obtiene una relación de rendimiento similar si mide funciones con, por ejemplo,int en lugar de cadena? – x4u
No quiero mencionar lo obvio, pero lo haré desde 100x parece fuera de línea en mi experiencia, pero no está ejecutando compilaciones de depuración \ y/o con el depurador conectado al hacer la medición de perfunción en el código .Net? –
@chibacity: De hecho, fue una versión de depuración con el depurador adjunto. Aunque todos los componentes, nativos y gestionados, se depuraron con depuradores. Voy a ejecutar mi número de nuevo con compilaciones de lanzamiento y verifico la diferencia. – ssube