2012-03-28 17 views
6

Tengo una gran suite de simulación escrita en Matlab, pero debido a las preocupaciones sobre una mejor interfaz con otros proyectos internos (así como la velocidad de ejecución) estoy pensando en trasladar algunas funcionalidades a .NET y llamar a tales objetos desde dentro de Matlab. ¿Cuál es la sobrecarga asociada con llamar a objetos .NET desde dentro de Matlab?.NET performance from Matlab

He aquí una buena discussion on Matlab OO que no habla de .NET

Editar: Breve estudio

me encontré con una prueba rápida por mi cuenta desde dentro de Matlab de las operaciones de acceso y asignación simples dentro de los diferentes objetos incluyendo objetos formales de Matlab (R2011b), Java y .NET llamando cada 1,000,000 de veces. Las llamadas al método hacen referencia al bucle interno, las llamadas de propiedad/campo se refieren al acceso al campo público desde Matlab y al bucle en Matlab. Los últimos resultados me sorprenden ya que la sobrecarga para .NET es mucho más alta que Java pero el tiempo de ejecución real es aproximadamente la mitad. Que esta pasando?

 
    Access(s) Assign(s) Type of object/call 
    --- MATLAB --- 
    0.003361 0.004268 'myObj.field' 
    0.003403 0.004263 'myStruct.field' 
    0.003376 0.003392 'myVar' 
    0.152629 0.303579 'myHandleObj.field' 
    25.79159 -   'TestConstant.const' 
    0.003384 -   'myTestConstant.const' (instance) 
    0.006794 0.008689 'TestObj.methods' 
    0.157509 0.303357 'TestHandleObj.methods' 

    --- NON-MATLAB --- 
    10.70006 16.42527 'JavaObj fields' 
    0.005063 0.005441 'JavaObj methods' 
    43.49988 43.96159 'NetObj fields' 
    0.002194 0.002306 'NetObj methods' 
+3

Al final de todas las respuestas que obtenga, se quedará pensando 'hmm, no hay forma de decidir, solo por argumento, cuánto sobrecarga está asociado con llamar a objetos .NET desde dentro de Matlab, lo haré tengo que medirlo para mi aplicación en mis sistemas '. También podría comenzar a medir los gastos generales ahora. –

+0

De hecho hice un breve estudio que puedo compartir, pero tengo menos de 100 representantes, por lo que aún no puedo responder mi propia pregunta. xP –

+0

Espero ver sus datos, ¿no puede editar su pregunta para incluirla? –

Respuesta

0

Una aplicación en ejecución consume recursos para recalcular y volver a pintar los datos con las herramientas GD I/GD I +. Ambas operaciones no están vinculadas entre sí. Recalcular significa ordenar, filtrar, agrupar y todas las demás operaciones, excepto el repintado.

2

Hay una sobrecarga significativa cuando se trabaja con métodos .NET en Matlab.

hice una pequeña prueba en Matlab (8.0.0.783 (R2012b)):

v = zeros(10000,1); 
for i=1:3 
    rnd = System.Random(); 
    tic; for j=1:10000, v(j) = rnd.NextDouble(); end; toc; 

    dt = System.DateTime(2014,1,28,0,0,0); 
    tic; for j=1:10000, dt = dt.AddSeconds(1); end; toc; 
end 

que toma en Matlab en mi aplicación de PC. 0.5 segundos para el primer ciclo y 1 segundo para el segundo ciclo. En el código .NET puro que toma 0.00015 y 0.0002 segundos. Por lo tanto, la sobrecarga al llamar a un método de objeto .NET en Matlab depende del objeto .NET y el método en cuestión.

Para métodos de objetos .NET más complejos, la sobrecarga puede ser incluso peor. Soy responsable de una API .NET para acceder a los archivos en un formato de datos científicos especializados.

Esta .NET API se puede utilizar desde Matlab. En el peor de los casos, solo lee un valor doble o flotante cada vez que llama a un método de lectura .NET (archivos de series temporales: por cada vez que hay un valor (doble o flotante) para una cantidad de elementos).

Un script para leer un archivo de este tipo muestra que Matlab en mi computadora portátil puede hacer algo menos de 1.000 llamadas a .NET por segundo.

Lo curioso es que si pongo el mismo código en una función de Matlab (básicamente pone la función read_file() como la primera línea en el script), Matlab hace aproximadamente 6.500 llamadas .NET por segundo. Entonces, dentro de una función, Matlab es aproximadamente 8 veces más rápido que dentro de un script, cuando se trata de llamar a esos métodos .NET. Eso no es reproducible con el ejemplo de prueba anterior.

La conclusión es que hay una sobrecarga significativa al llamar a un método .NET desde Matlab. Es importante hacer que .NET api sea "grumoso" en lugar de "hablador".

Hemos resuelto nuestros problemas mediante la creación de un conjunto de método "chunky helper" en una utilidad .NET dll, que hace toda la lectura, recopila datos en una matriz grande y devuelve la matriz en una llamada a Matlab, básicamente minimizando la actividad sobre el límite Matlab-.NET.

El subyacente.El código NET parece ser tan rápido cuando se ejecuta desde una aplicación .NET pura como cuando se ejecuta desde Matlab.